@openhands/agent-canvas 1.18.0 → 1.20.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/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/acp-providers-DOKcGeaV.js +1 -0
- package/build/assets/active-backend-context-BETEdaJl.js +2 -0
- package/build/assets/{agent-context-settings-D3peZkjX.js → agent-context-settings-Dir0loAn.js} +1 -1
- package/build/assets/{agent-profiles-service.api-DkeZaqIl.js → agent-profiles-service.api-CiMVQAIT.js} +1 -1
- package/build/assets/{agent-profiles-settings-7yMWYjGF.js → agent-profiles-settings-CT5owzRT.js} +1 -1
- package/build/assets/agent-server-conversation-service.api-BtOlitCD.js +88 -0
- package/build/assets/agent-settings-BnzyTgCb.js +2 -0
- package/build/assets/agent-settings-CeXj3xK-.js +1 -0
- package/build/assets/{alert-banner-eYyqvHL3.js → alert-banner-Ccx1Du6n.js} +1 -1
- package/build/assets/{api-key-entry-screen-CCBvBD8u.js → api-key-entry-screen-DXIuzBjY.js} +1 -1
- package/build/assets/{app-settings-BtYDs-Be.js → app-settings-DkIJVTKL.js} +1 -1
- package/build/assets/automation-detail-CF2SweVs.js +3 -0
- package/build/assets/automation-disabled-reason-QFtMrdOr.js +1 -0
- package/build/assets/{automation-export-BJsfi7n2.js → automation-export-CkvehhPF.js} +1 -1
- package/build/assets/{automation-git-sync-B7o_Nbl-.js → automation-git-sync-di4tBAyZ.js} +1 -1
- package/build/assets/automation-setup-route-FERj7WEe.js +3 -0
- package/build/assets/{automation-templates-Bb98r-kx.js → automation-templates-DlaCRvD-.js} +1 -1
- package/build/assets/automations-list-yK7ETmYP.js +1 -0
- package/build/assets/{back-nav-button-B2yBiVMB.js → back-nav-button-oDvIxpQ5.js} +1 -1
- package/build/assets/backend-form-modal-DzYf_arO.js +1 -0
- package/build/assets/{backend-synced-settings-badge-DLEp6cq7.js → backend-synced-settings-badge-DXDDHWX4.js} +1 -1
- package/build/assets/{badge-ehL-kgeO.js → badge-CDHZEVeN.js} +1 -1
- package/build/assets/{base-modal-C1a0TsSx.js → base-modal-CZq4kB_H.js} +1 -1
- package/build/assets/{brand-button-CUMfjb99.js → brand-button-CGUwj6zK.js} +1 -1
- package/build/assets/{browser-SE24Tk8g.js → browser-kY6jN61T.js} +2 -2
- package/build/assets/{browser-tab-HjJxHA0V.js → browser-tab-DFyZXsnB.js} +1 -1
- package/build/assets/{canvas-extension-page-BsUGBb1T.js → canvas-extension-page-DsGq1DtT.js} +1 -1
- package/build/assets/{canvas-extensions-C9Tm6s_E.js → canvas-extensions-Cb2Z0Hdc.js} +1 -1
- package/build/assets/{canvas-extensions-runtime-B8kxM4rO.js → canvas-extensions-runtime-DS6eT4nK.js} +1 -1
- package/build/assets/{chat-send-button-CGvc2wpE.js → chat-send-button-B6aVaD9V.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-BDX_ctNs.js → circle-plus-check-toggle-ZOXpJ3I2.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-D5uJ_4JE.js → cloud-funnel-analytics-BH_zxjiO.js} +1 -1
- package/build/assets/{cog-CAEugqtV.js → cog-DVZT1f0s.js} +1 -1
- package/build/assets/{command-menu-CQxs4mtX.js → command-menu-ImeHQ6c2.js} +1 -1
- package/build/assets/{commits-tab-D0xgjipP.js → commits-tab-B5SUF66c.js} +1 -1
- package/build/assets/{condenser-settings-D63NJRBT.js → condenser-settings-BlGOXEXM.js} +1 -1
- package/build/assets/{confirmation-modal-78sd9Vny.js → confirmation-modal-oN1EId79.js} +1 -1
- package/build/assets/{context-menu-list-item-Cm7-7Y-7.js → context-menu-list-item-DIm5xQg6.js} +1 -1
- package/build/assets/{conversation-B_nweu5p.js → conversation-9a53tdbO.js} +4 -4
- package/build/assets/conversation-XRsI28ZM.js +1 -0
- package/build/assets/conversation-panel-XRsI28ZM.js +1 -0
- package/build/assets/{conversation-state-store-9D_3P7q4.js → conversation-state-store-Br-eE-gg.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-B3dpJXX0.js → conversation-tab-empty-state-BT1GrnKP.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-B1ljgNxO.js → copy-to-clipboard-button-CvTHqY13.js} +1 -1
- package/build/assets/{device-verify-D5QRIS_x.js → device-verify-DX0xdNjo.js} +1 -1
- package/build/assets/{dropdown-classes-BGvOvW2_.js → dropdown-classes-DyyMaaXl.js} +1 -1
- package/build/assets/edit-automation-modal-bfD-5NIc.js +1 -0
- package/build/assets/empty-state-B5advKVW.js +1 -0
- package/build/assets/{entry.client-BMafTpjO.js → entry.client-D_2gnSyB.js} +2 -2
- package/build/assets/{enum-filter-dropdown-UNaom12H.js → enum-filter-dropdown-VAJp5mqh.js} +1 -1
- package/build/assets/{environment-switch-overlay-COibRUA-.js → environment-switch-overlay-C7x_yhEs.js} +1 -1
- package/build/assets/{error-state-Cf8LRuuY.js → error-state-BgYl7YeB.js} +1 -1
- package/build/assets/{extensions-hub-C_6ahIua.js → extensions-hub-DjhOed1I.js} +1 -1
- package/build/assets/{extensions-navigation-C5GfpzFe.js → extensions-navigation-Di-J2KUR.js} +1 -1
- package/build/assets/{files-tab-D5PPIWI1.js → files-tab-BNDp3e_x.js} +1 -1
- package/build/assets/{form-control-classes-Dbq-7YP_.js → form-control-classes-BVI_szaj.js} +1 -1
- package/build/assets/{get-git-path-jU2zjqIB.js → get-git-path-DOe6PM_a.js} +1 -1
- package/build/assets/git-repo-dropdown-1fZGYtYm.js +1 -0
- package/build/assets/{git-repo-dropdown-uxlFw2gn.js → git-repo-dropdown-DNlinQ7r.js} +1 -1
- package/build/assets/{highlighted-source-view-C7pAXrT0.js → highlighted-source-view-DPerL6tF.js} +1 -1
- package/build/assets/home-4lyLzYjG.js +1 -0
- package/build/assets/home-BGaB0EeK.js +1 -0
- package/build/assets/home-automation-run-tooltip-v5n7zXR0.js +1 -0
- package/build/assets/{home-store-DCbei3DX.js → home-store-roz1x6D5.js} +1 -1
- package/build/assets/{hooks-service-Dnmhqc0Z.js → hooks-service-tzRqtAlm.js} +1 -1
- package/build/assets/index-home-6Y_Y7kOo.js +1 -0
- package/build/assets/{install-server-modal-B81I-5OE.js → install-server-modal-DkMCfj0J.js} +1 -1
- package/build/assets/{key-O84CMFHb.js → key-DpfBWQbk.js} +1 -1
- package/build/assets/{launch-ZLxI4opd.js → launch-TrnYlJe6.js} +1 -1
- package/build/assets/link-external-B4gx3EeM.js +1 -0
- package/build/assets/llm-not-configured-banner-BdjItKQR.js +27 -0
- package/build/assets/{llm-settings-CODhjQzy.js → llm-settings-CUgt39uu.js} +1 -1
- package/build/assets/llm-settings-DEfw-fUJ.js +1 -0
- package/build/assets/{llm-subscription-service-CgIDc38n.js → llm-subscription-service-LGYVzyAc.js} +1 -1
- package/build/assets/{loading-spinner-BeLV0IXf.js → loading-spinner-BJc2J0Dw.js} +1 -1
- package/build/assets/{manage-backends-modal-cMXqCb-B.js → manage-backends-modal-CIjk0B2H.js} +1 -1
- package/build/assets/manifest-23d79467.js +1 -0
- package/build/assets/{manifest-subpage-layout-CVZgVKoY.js → manifest-subpage-layout-DGYRoP_8.js} +1 -1
- package/build/assets/{markdown-renderer-DyFl9-mL.js → markdown-renderer-DRpwRlNm.js} +1 -1
- package/build/assets/mcp-CoUOIGBF.js +1 -0
- package/build/assets/mcp-installed-servers-BW51n6PC.js +1 -0
- package/build/assets/mcp-marketplace-utils-BwEnDYqm.js +1 -0
- package/build/assets/mcp-page-hZ4aJjj_.js +9 -0
- package/build/assets/{messages-Bk1xhbU2.js → messages-WUb9Yh-p.js} +4 -4
- package/build/assets/{modal-body-C24WsdFb.js → modal-body-B_95ci1c.js} +1 -1
- package/build/assets/{modal-classes-B0b9eiL8.js → modal-classes-BPcBCWVj.js} +1 -1
- package/build/assets/{modal-close-button-DfqfB2Nj.js → modal-close-button-Cq3dma5u.js} +1 -1
- package/build/assets/onboarding-Cc4Av7bi.js +1 -0
- package/build/assets/{onboarding-modal-BT3Gx_sZ.js → onboarding-modal-DCFD4Dsa.js} +1 -1
- package/build/assets/{organization-service.api-B5CvmnYQ.js → organization-service.api-zhHpQU0t.js} +1 -1
- package/build/assets/parse-git-remote-url-BG8pcKL8.js +1 -0
- package/build/assets/{planner-tab-CstoOlAB.js → planner-tab-yISBVUKu.js} +1 -1
- package/build/assets/{plugins-management-service-5rqVPEGN.js → plugins-management-service-2oP6_tWr.js} +1 -1
- package/build/assets/{profiles-service.api-D1XKMgr0.js → profiles-service.api-B5thiTI3.js} +1 -1
- package/build/assets/{providers-XmZ9HM4Q.js → providers-Co9PsD0s.js} +1 -1
- package/build/assets/{proxy-XP6U1Dhv.js → proxy-BCCQUna8.js} +1 -1
- package/build/assets/recommended-automations-launcher-D1Do753p.js +1 -0
- package/build/assets/root-D1y82Lhg.js +2 -0
- package/build/assets/{root-layout-DUquNZTU.js → root-layout-cQTYEG2w.js} +2 -2
- package/build/assets/root-sEWn3ha1.css +1 -0
- package/build/assets/{schema-field-Y3F8JvXd.js → schema-field-DSi0d7a8.js} +1 -1
- package/build/assets/{sdk-section-page-CNZTLwH9.js → sdk-section-page-DCoI2dtd.js} +1 -1
- package/build/assets/{secret-form-9-BoGA40.js → secret-form-BDvzojzN.js} +1 -1
- package/build/assets/{secrets-service-BOIsfD9j.js → secrets-service-C3CNNEpY.js} +1 -1
- package/build/assets/{secrets-settings-CBJgFr42.js → secrets-settings-BKqfYQt5.js} +1 -1
- package/build/assets/{settings-D4hdToD4.js → settings-C8ZLONyx.js} +1 -1
- package/build/assets/{settings-dropdown-input-DBvsZ7-Q.js → settings-dropdown-input-Df_HXRk4.js} +1 -1
- package/build/assets/{settings-index-DeQphyBK.js → settings-index-BWvlGHg3.js} +1 -1
- package/build/assets/{settings-input-dVuzapBA.js → settings-input-B3i5U9GL.js} +1 -1
- package/build/assets/{settings-list-classes-DhAPuXm6.js → settings-list-classes-DbqcSiVW.js} +1 -1
- package/build/assets/{settings-modal-tHiJ8iYV.js → settings-modal-DHKJSBPL.js} +1 -1
- package/build/assets/{settings-nav-GAQjW1a-.js → settings-nav-BThjwLWD.js} +1 -1
- package/build/assets/{settings-service.api-C1vZH9Vh.js → settings-service.api-CYBTLGOd.js} +1 -1
- package/build/assets/{settings-switch-DDd1cQ8t.js → settings-switch-CI93Iozg.js} +1 -1
- package/build/assets/{shared-conversation-Cyg7m7ns.js → shared-conversation-C7OILS-U.js} +1 -1
- package/build/assets/{sidebar-layout-DH0E-5KW.js → sidebar-layout-Csb6Geq0.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-CQ4iky__.js → sidebar-mobile-menu-toggle-B2xwXm4s.js} +1 -1
- package/build/assets/{sidebar-nav-link-oLQiKUBu.js → sidebar-nav-link-Xv7QEMVS.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-TfvNNnnr.js → sidebar-onboarding-checklist-storage-_zxMqHS0.js} +1 -1
- package/build/assets/{skill-card-pill-row-DfjIfj0K.js → skill-card-pill-row-CxOFySng.js} +1 -1
- package/build/assets/{skill-enablement-DXeaImBz.js → skill-enablement-BBKya60C.js} +1 -1
- package/build/assets/{skill-filter-DsNLmn76.js → skill-filter-BvtbD--b.js} +1 -1
- package/build/assets/{skill-icon-badge-0MK_68Nc.js → skill-icon-badge-CVxE42yg.js} +1 -1
- package/build/assets/{skill-scope-BE-H9TSZ.js → skill-scope-C0NxJnpT.js} +1 -1
- package/build/assets/{skills-plugins-vzSdxSk_.js → skills-plugins-BGjX4jve.js} +1 -1
- package/build/assets/{skills-settings-BiPOH9H9.js → skills-settings-d3ZwIjSP.js} +1 -1
- package/build/assets/{styled-tooltip-CejG0rqv.js → styled-tooltip-CknPQH4Y.js} +1 -1
- package/build/assets/{task-list-tab-OkZSqnTp.js → task-list-tab-CQisRcPh.js} +1 -1
- package/build/assets/{terminal-Dph60VFZ.js → terminal-Bs50gJPC.js} +1 -1
- package/build/assets/{toggle-switch-B2uXaAUS.js → toggle-switch-D3TBxlsc.js} +1 -1
- package/build/assets/trash-D1QMHInX.js +1 -0
- package/build/assets/{typography-DgcLGdHk.js → typography-BdAApXGl.js} +1 -1
- package/build/assets/{usage-tab-MCmNRAnR.js → usage-tab-ClVHAFJy.js} +1 -1
- package/build/assets/{use-acp-credential-form-ychoGqjC.js → use-acp-credential-form-GfqcTJl5.js} +1 -1
- package/build/assets/{use-activate-agent-profile-8L8Xdghy.js → use-activate-agent-profile-DO6SNPkK.js} +1 -1
- package/build/assets/{use-agent-profiles-Bi8hSkze.js → use-agent-profiles-YsBlt3tT.js} +1 -1
- package/build/assets/{use-automation-health-U99vvHxx.js → use-automation-health-CbQ9n-k7.js} +1 -1
- package/build/assets/{use-automation-permissions-Buus0R6h.js → use-automation-permissions-gFy-2VD0.js} +1 -1
- package/build/assets/{use-automations-Bq5hVuv0.js → use-automations-7_XBXHQK.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-MzIeEV8F.js → use-can-manage-org-profiles-Dt4YkPO7.js} +1 -1
- package/build/assets/{use-canvas-extensions-Ca9KoVEm.js → use-canvas-extensions-BhYQrtMK.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-B4ZLUZSa.js → use-cloud-current-user-id-Dqw6qQUg.js} +1 -1
- package/build/assets/{use-config-l5tkDHyD.js → use-config-BJ_FJCjV.js} +1 -1
- package/build/assets/use-create-conversation-D15Px574.js +1 -0
- package/build/assets/use-create-secret-D_qPU88t.js +1 -0
- package/build/assets/{use-free-models-gCsJ5BV0.js → use-free-models-FAk2nngq.js} +1 -1
- package/build/assets/{use-get-secrets-CMTuWEp_.js → use-get-secrets-Pbo9jh2A.js} +1 -1
- package/build/assets/{use-llm-configured-Dl4zg8ht.js → use-llm-configured-DF9BYmIe.js} +1 -1
- package/build/assets/{use-llm-profiles-SWsuFmFu.js → use-llm-profiles-U4u1gzuk.js} +1 -1
- package/build/assets/use-manifest-capabilities-D81_YdAF.js +1 -0
- package/build/assets/{use-onboarding-completion-Xl63ZvzQ.js → use-onboarding-completion-C4W-m2Jk.js} +1 -1
- package/build/assets/{use-pinned-home-route-BXDIUaxQ.js → use-pinned-home-route-DByWTojw.js} +1 -1
- package/build/assets/{use-plugins-marketplace-BIIaPiaB.js → use-plugins-marketplace-CTRoukH0.js} +1 -1
- package/build/assets/{use-save-agent-profile-D-ZHHE94.js → use-save-agent-profile-xpHBxMZM.js} +1 -1
- package/build/assets/{use-save-settings-Dapkf4cC.js → use-save-settings-CmX41wlf.js} +1 -1
- package/build/assets/{use-settings-C2KKQKVC.js → use-settings-D69cw06D.js} +1 -1
- package/build/assets/{use-settings-nav-items-TOc0Rsfd.js → use-settings-nav-items-CVz0SnDr.js} +1 -1
- package/build/assets/use-tracking-BAFpgpgq.js +3 -0
- package/build/assets/{use-user-conversation-5UFqMoO4.js → use-user-conversation-BBDXUbOc.js} +1 -1
- package/build/assets/utils-CbjwNcR-.js +1 -0
- package/build/assets/{vendor~browser-hbU4u2Ag.js → vendor~browser-BZ-zIfb6.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-DvZtOcoT.js +2 -0
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js → vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-BIjRfQ4u.js} +1 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-BBfdJIV9.js +48 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-fgzdgvrL.js} +3579 -165
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BqdU447s.js} +794 -227
- package/build/assets/{verification-settings-DdBpaVPz.js → verification-settings-BXspn27q.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +18 -1
- package/build/locales/ca/openhands.json +18 -1
- package/build/locales/de/openhands.json +18 -1
- package/build/locales/en/openhands.json +18 -1
- package/build/locales/es/openhands.json +18 -1
- package/build/locales/fr/openhands.json +18 -1
- package/build/locales/it/openhands.json +18 -1
- package/build/locales/ja/openhands.json +18 -1
- package/build/locales/ko-KR/openhands.json +18 -1
- package/build/locales/no/openhands.json +18 -1
- package/build/locales/pt/openhands.json +18 -1
- package/build/locales/tr/openhands.json +18 -1
- package/build/locales/uk/openhands.json +18 -1
- package/build/locales/zh-CN/openhands.json +18 -1
- package/build/locales/zh-TW/openhands.json +18 -1
- package/config/defaults.json +3 -3
- package/dist/api/agent-profiles-service/profile-field-support.d.ts +2 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs +3 -3
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js +12 -16
- package/dist/components/conversation-events/chat/event-content-helpers/get-skill-ready-content.js.map +1 -1
- package/dist/components/features/automations/agent-profile-selector.d.ts +7 -0
- package/dist/components/features/automations/detail/disabled-reason-banner.d.ts +16 -0
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +38 -29
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
- package/dist/components/features/settings/agent-profiles/profile-scope-list.d.ts +20 -0
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +0 -5
- package/dist/constants/acp-providers.js +20 -16
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/constants/profile-scope.d.ts +21 -0
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +30 -19
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.cjs +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-acp-model.js +11 -12
- package/dist/hooks/mutation/use-switch-acp-model.js.map +1 -1
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +1 -0
- package/dist/hooks/query/query-keys.js +10 -1
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.cjs +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.cjs.map +1 -1
- package/dist/hooks/query/use-active-acp-profile-detail.d.ts +0 -9
- package/dist/hooks/query/use-active-acp-profile-detail.js +4 -13
- package/dist/hooks/query/use-active-acp-profile-detail.js.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.js +3 -1
- package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
- package/dist/hooks/use-drag-resize.cjs +1 -1
- package/dist/hooks/use-drag-resize.cjs.map +1 -1
- package/dist/hooks/use-drag-resize.js +8 -9
- package/dist/hooks/use-drag-resize.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +18 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +3 -3
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +289 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +18 -1
- package/dist/locales/ca/openhands.json +18 -1
- package/dist/locales/de/openhands.json +18 -1
- package/dist/locales/en/openhands.json +18 -1
- package/dist/locales/es/openhands.json +18 -1
- package/dist/locales/fr/openhands.json +18 -1
- package/dist/locales/it/openhands.json +18 -1
- package/dist/locales/ja/openhands.json +18 -1
- package/dist/locales/ko-KR/openhands.json +18 -1
- package/dist/locales/no/openhands.json +18 -1
- package/dist/locales/pt/openhands.json +18 -1
- package/dist/locales/tr/openhands.json +18 -1
- package/dist/locales/uk/openhands.json +18 -1
- package/dist/locales/zh-CN/openhands.json +18 -1
- package/dist/locales/zh-TW/openhands.json +18 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/manifest-local-validation.cjs.map +1 -1
- package/dist/manifests/manifest-local-validation.js.map +1 -1
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +2 -2
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +3670 -247
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +26 -3
- package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +4 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js +79 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-delivery-watchdog/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +25 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js +72 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-triage/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -10
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +24 -11
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs +12 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.js +115 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/gitlab-issue-to-mr/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +20 -14
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs +2 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.js +73 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog/reportportal.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +9 -7
- package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.cjs +794 -227
- package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/skills/index.js +46 -6
- package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js +15 -8
- package/dist/node_modules/@openhands/typescript-client/dist/client/agent-server-compatibility.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js +11 -13
- package/dist/node_modules/@openhands/typescript-client/dist/client/bash-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js +6 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/conversation-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js +9 -12
- package/dist/node_modules/@openhands/typescript-client/dist/client/file-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js +9 -10
- package/dist/node_modules/@openhands/typescript-client/dist/client/openhands-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs +2 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.cjs.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js +41 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/runtime-transport.js.map +1 -0
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +2 -2
- package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js +3 -6
- package/dist/node_modules/@openhands/typescript-client/dist/client/vscode-client.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/clients.js +1 -2
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/conversation/conversation-manager.js +0 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +199 -61
- package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs.map +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js +9 -8
- package/dist/node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js.map +1 -1
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +3 -3
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +11 -0
- package/dist/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +26 -2
- package/dist/types/automation.js.map +1 -1
- package/dist/utils/automation-disabled-reason.cjs +2 -0
- package/dist/utils/automation-disabled-reason.cjs.map +1 -0
- package/dist/utils/automation-disabled-reason.d.ts +32 -0
- package/dist/utils/automation-disabled-reason.js +19 -0
- package/dist/utils/automation-disabled-reason.js.map +1 -0
- package/dist/utils/parse-git-remote-url.cjs +1 -1
- package/dist/utils/parse-git-remote-url.cjs.map +1 -1
- package/dist/utils/parse-git-remote-url.d.ts +5 -1
- package/dist/utils/parse-git-remote-url.js +20 -13
- package/dist/utils/parse-git-remote-url.js.map +1 -1
- package/package.json +3 -3
- package/scripts/check-sdk-version-sync.mjs +79 -8
- package/scripts/dev-safe.mjs +14 -1
- package/scripts/docker-build.mjs +3 -0
- package/scripts/static-server.mjs +24 -7
- package/build/assets/acp-providers-DcY_mKYa.js +0 -1
- package/build/assets/active-backend-context-BnH4-L8h.js +0 -2
- package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +0 -88
- package/build/assets/agent-settings-BF8hM6wb.js +0 -2
- package/build/assets/agent-settings-YPutBAeR.js +0 -1
- package/build/assets/automation-detail-BxXhb_m2.js +0 -3
- package/build/assets/automation-setup-route-qaJ6lLCf.js +0 -3
- package/build/assets/automations-list-DEPVNud3.js +0 -1
- package/build/assets/backend-form-modal-DxisQV_6.js +0 -1
- package/build/assets/conversation-edjzrv5w.js +0 -1
- package/build/assets/conversation-panel-edjzrv5w.js +0 -1
- package/build/assets/edit-automation-modal-D_JWSmxT.js +0 -1
- package/build/assets/empty-state-FK_s1B60.js +0 -1
- package/build/assets/git-repo-dropdown-BoDDWXfX.js +0 -1
- package/build/assets/home-BM5_Wz_R.js +0 -1
- package/build/assets/home-Ivfm7KC4.js +0 -1
- package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +0 -1
- package/build/assets/index-home-td9BN2T3.js +0 -1
- package/build/assets/kebab-menu-item-content-SCJBwZnp.js +0 -1
- package/build/assets/link-external-BNZzCM1I.js +0 -1
- package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +0 -27
- package/build/assets/llm-settings-CZaXYgtw.js +0 -1
- package/build/assets/manifest-bfeccb98.js +0 -1
- package/build/assets/mcp-CraxoXQv.js +0 -1
- package/build/assets/mcp-marketplace-utils-C7PYr293.js +0 -1
- package/build/assets/mcp-page-CteH_K0N.js +0 -9
- package/build/assets/onboarding-DXFBRqEy.js +0 -1
- package/build/assets/parse-git-remote-url-DpDM9bK6.js +0 -1
- package/build/assets/recommended-automations-launcher-DEHRKIAg.js +0 -1
- package/build/assets/root-CM6IZHlg.css +0 -1
- package/build/assets/root-DdFkodKW.js +0 -2
- package/build/assets/trash-Ckh7yCaB.js +0 -1
- package/build/assets/use-create-conversation-i_PdFdIs.js +0 -1
- package/build/assets/use-create-secret-CjWq0J4O.js +0 -1
- package/build/assets/use-manifest-capabilities-CdqYfUAC.js +0 -1
- package/build/assets/use-tracking-j4uo9VEW.js +0 -3
- package/build/assets/utils-BgLSZdyy.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +0 -2
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js +0 -48
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs +0 -2
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.cjs.map +0 -1
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js +0 -21
- package/dist/node_modules/@openhands/typescript-client/dist/client/desktop-client.js.map +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/__vite-browser-external-NEUUz2mh.js","assets/rolldown-runtime-Cyuzqnbw.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e}from"./rolldown-runtime-Cyuzqnbw.js";import{xt as t}from"./vendor-styling-Ck5D_A2Q.js";var n=class extends Error{constructor(e,t,n,r){super(r||`HTTP ${e}: ${t}`),this.status=e,this.statusText=t,this.response=n,this.name=`HttpError`}},r=class{constructor(e){this.baseUrl=e.baseUrl.replace(/\/$/,``),this.apiKey=e.apiKey,this.timeout=e.timeout||6e4}buildUrl(e,t){let n=e.startsWith(`/`)?e.slice(1):e,r=new URL(n,this.baseUrl+`/`);return t&&Object.entries(t).forEach(([e,t])=>{t!=null&&(Array.isArray(t)?t.forEach(t=>r.searchParams.append(e,String(t))):r.searchParams.append(e,String(t)))}),r}async request(e){if(e.method===`GET`&&e.data!==void 0&&e.data!==null)return this.requestWithBodyOnGet(e);let t=this.buildUrl(e.url,e.params),r={"Content-Type":`application/json`,...e.headers};this.apiKey&&(r[`X-Session-API-Key`]=this.apiKey);let i={method:e.method,headers:r,signal:AbortSignal.timeout(e.timeout||this.timeout)};e.credentials&&(i.credentials=e.credentials),e.data&&e.method!==`GET`&&(e.data instanceof FormData?(delete r[`Content-Type`],i.body=e.data):i.body=JSON.stringify(e.data));try{let r=await fetch(t.toString(),i);if(!(e.acceptableStatusCodes?.has(r.status)||!e.acceptableStatusCodes&&r.ok)){let e;try{e=r.headers.get(`content-type`)?.includes(`application/json`)?await r.json():await r.text()}catch{e=null}throw new n(r.status,r.statusText,e,`HTTP request failed (${r.status} ${r.statusText}): ${JSON.stringify(e)}`)}let a=await this.parseResponse(r,e.responseType||`auto`),o={};return r.headers.forEach((e,t)=>{o[t]=e}),{data:a,status:r.status,statusText:r.statusText,headers:o}}catch(t){throw t instanceof n?t:t instanceof Error?t.name===`AbortError`?Error(`Request timeout after ${e.timeout||this.timeout}ms`,{cause:t}):Error(`Request failed: ${t.message}`,{cause:t}):Error(`Unknown request error`,{cause:t})}}async requestWithBodyOnGet(r){let i=this.buildUrl(r.url,r.params),a=typeof r.data==`string`?r.data:JSON.stringify(r.data),o={"Content-Type":`application/json`,...r.headers,"Content-Length":String(Buffer.byteLength(a))};this.apiKey&&(o[`X-Session-API-Key`]=this.apiKey);let s=(i.protocol,await t(()=>import(`./__vite-browser-external-NEUUz2mh.js`).then(t=>e(t.default,1)),__vite__mapDeps([0,1]))),c=r.timeout||this.timeout;return new Promise((e,t)=>{let l=s.request(i,{method:r.method,headers:o},i=>{let a=[];i.on(`data`,e=>a.push(e)),i.on(`end`,()=>{try{let o=i.statusCode??0,s=i.statusMessage??``,c={};for(let[e,t]of Object.entries(i.headers))t!==void 0&&(c[e]=Array.isArray(t)?t.join(`, `):t);let l=Buffer.concat(a),u=c[`content-type`];if(!(r.acceptableStatusCodes?.has(o)||!r.acceptableStatusCodes&&o>=200&&o<300)){let e=l.toString(`utf-8`),r;try{r=u?.includes(`application/json`)?JSON.parse(e):e}catch{r=e||null}t(new n(o,s,r,`HTTP request failed (${o} ${s}): ${JSON.stringify(r)}`));return}e({data:this.parseNodeResponse(l,u,r.responseType||`auto`),status:o,statusText:s,headers:c})}catch(e){t(e)}})});l.on(`error`,e=>{t(Error(`Request failed: ${e.message}`,{cause:e}))}),l.setTimeout(c,()=>{l.destroy(Error(`Request timeout after ${c}ms`))}),l.end(a)})}parseNodeResponse(e,t,n){if(n===`blob`)return new Blob([new Uint8Array(e)]);if(n===`arrayBuffer`)return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);let r=e.toString(`utf-8`);return n===`text`?r:n===`json`||t?.includes(`application/json`)?r?JSON.parse(r):void 0:r}async parseResponse(e,t){return t===`json`?await e.json():t===`text`?await e.text():t===`blob`?await e.blob():t===`arrayBuffer`?await e.arrayBuffer():e.headers.get(`content-type`)?.includes(`application/json`)?await e.json():await e.text()}async get(e,t){return this.request({method:`GET`,url:e,...t})}async post(e,t,n){return this.request({method:`POST`,url:e,data:t,...n})}async put(e,t,n){return this.request({method:`PUT`,url:e,data:t,...n})}async patch(e,t,n){return this.request({method:`PATCH`,url:e,data:t,...n})}async delete(e,t){return this.request({method:`DELETE`,url:e,...t})}close(){}},i=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout??6e4})}async listAgentProfiles(){return(await this.client.get(`/api/agent-profiles`)).data}async getAgentProfile(e,t={}){let n={};return t.exposeSecrets&&(n[`X-Expose-Secrets`]=t.exposeSecrets),(await this.client.get(`/api/agent-profiles/${encodeURIComponent(e)}`,{headers:n})).data}async saveAgentProfile(e,t){return(await this.client.post(`/api/agent-profiles/${encodeURIComponent(e)}`,t)).data}async deleteAgentProfile(e){return(await this.client.delete(`/api/agent-profiles/${encodeURIComponent(e)}`)).data}async renameAgentProfile(e,t){return(await this.client.post(`/api/agent-profiles/${encodeURIComponent(e)}/rename`,{new_name:t})).data}async activateAgentProfile(e){return(await this.client.post(`/api/agent-profiles/${encodeURIComponent(e)}/activate`,{})).data}async materializeAgentProfile(e){return(await this.client.post(`/api/agent-profiles/${encodeURIComponent(e)}/materialize`,{})).data}close(){this.client.close()}},a=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getRoot(){return(await this.client.get(`/`)).data}async getAlive(){return(await this.client.get(`/alive`)).data}async getHealth(){return(await this.client.get(`/health`)).data}async getReady(){return(await this.client.get(`/ready`,{acceptableStatusCodes:new Set([200,503])})).data}async getServerInfo(){return(await this.client.get(`/server_info`)).data}close(){this.client.close()}},o=`AGENT_SERVER_VERSION_TOO_OLD`,s={workspaces:{feature:`workspaces`,displayName:`Workspaces`,minVersion:`1.23.0`},hooks:{feature:`hooks`,displayName:`Hooks API`,minVersion:`1.23.0`},mcpTest:{feature:`mcp-test`,displayName:`MCP test API`,minVersion:`1.23.0`},mcpOAuth:{feature:`mcp-oauth`,displayName:`MCP OAuth API`,minVersion:`1.31.0`}},c=class e extends Error{constructor({requirement:t,actualVersion:n}){super(`${t.displayName} requires agent-server ${t.minVersion} or newer; this backend is running ${n}. Please upgrade your agent-server backend.`),this.code=o,this.name=`AgentServerVersionError`,this.feature=t.feature,this.displayName=t.displayName,this.requiredVersion=t.minVersion,this.actualVersion=n,Object.setPrototypeOf(this,e.prototype)}},l=new WeakMap;function u(e){return e instanceof c||typeof e==`object`&&!!e&&`code`in e&&e.code===`AGENT_SERVER_VERSION_TOO_OLD`}function d(e){if(e){l.delete(e);return}l=new WeakMap}async function f(e){let t=l.get(e);if(t)return t;let n=e.get(`/server_info`).then(e=>e.data);return l.set(e,n),n}async function p(e,t){let n=await f(e),r=typeof n.version==`string`&&n.version.trim()?n.version.trim():`unknown`,i=m(r,t.minVersion);if(i===null||i<0)throw new c({requirement:t,actualVersion:r});return n}function m(e,t){let n=h(e),r=h(t);if(!n||!r)return null;for(let e of[`major`,`minor`,`patch`]){if(n[e]>r[e])return 1;if(n[e]<r[e])return-1}return n.prerelease&&!r.prerelease?-1:!n.prerelease&&r.prerelease?1:n.prerelease&&r.prerelease?n.prerelease.localeCompare(r.prerelease):0}function h(e){let[t]=e.trim().replace(/^v/,``).split(`+`),[n,r]=t.split(`-`,2),i=n.split(`.`);if(i.length!==3)return null;let[a,o,s]=i.map(e=>Number(e));return[a,o,s].every(e=>Number.isInteger(e)&&e>=0)?{major:a,minor:o,patch:s,prerelease:r}:null}var g=class extends r{constructor(e,t,n){if(super({baseUrl:e.host}),this.serverClient=t,this.conversationId=n,!n.trim())throw Error(`A runtime requires a conversation ID`)}async request(e){if(!e.url.startsWith(`/api/`)||e.url.includes(`?`)||e.url.includes(`#`)||e.url.includes(`\\`)||e.url.split(`/`).some(e=>[`.`,`..`].includes(decodeURIComponent(e))))throw Error(`Runtime requests require an API path and separate query parameters`);if(e.params?.cid!=null)throw Error(`A runtime conversation cannot be overridden`);let t=(await f(this.serverClient).catch(e=>{if(e instanceof n&&e.status===404)return null;throw d(this.serverClient),e}))?.capabilities?.includes(`conversation_runtime_routes_v1`)?{...e,url:`/api/conversations/${encodeURIComponent(this.conversationId)}${e.url.slice(4)}`}:{...e,params:{...e.params,cid:this.conversationId}};return this.serverClient.request(t)}};function _(e){let t=new r({baseUrl:e.host,apiKey:e.apiKey,timeout:e.timeout});return{serverClient:t,runtimeClient:e.conversationId===void 0?t:new g(e,t,e.conversationId)}}var v=class{constructor(e){let{runtimeClient:t}=_(e);this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=t}async searchEvents(e={}){return(await this.client.get(`/api/bash/bash_events/search`,{params:e})).data}async getEvent(e){return(await this.client.get(`/api/bash/bash_events/${e}`)).data}async getEvents(e){return Promise.all(e.map(async e=>{try{return await this.getEvent(e)}catch(e){if(e instanceof n&&e.status===404)return null;throw e}}))}async batchGetEvents(e){return(await this.client.get(`/api/bash/bash_events/`,{data:e})).data}async startCommand(e,t,n){let r=this.normalizeRequest(e,t,n);return(await this.client.post(`/api/bash/start_bash_command`,r)).data}async executeCommand(e,t,n){let r=this.normalizeRequest(e,t,n);return(await this.client.post(`/api/bash/execute_bash_command`,r,{timeout:((r.timeout||30)+10)*1e3})).data}async clearEvents(){return(await this.client.delete(`/api/bash/bash_events`)).data}close(){this.client.close()}normalizeRequest(e,t,n){return typeof e==`string`?{command:e,...t?{cwd:t}:{},...n===void 0?{}:{timeout:Math.floor(n)}}:{...e,...e.timeout===void 0?{}:{timeout:Math.floor(e.timeout)}}}},y=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async createConversation(e){return(await this.client.post(`/api/conversations`,e)).data}async searchConversations(e={}){return(await this.client.get(`/api/conversations/search`,{params:e})).data}async countConversations(e={}){return(await this.client.get(`/api/conversations/count`,{params:e})).data}async getConversations(e){return(await this.client.get(`/api/conversations`,{params:{ids:e}})).data}async getConversation(e){return(await this.client.get(`/api/conversations/${e}`)).data}async getRuntime(e){return(await this.client.get(`/api/conversations/${e}/runtime`)).data}async reprovisionRuntime(e){return(await this.client.post(`/api/conversations/${e}/runtime/reprovision`,{})).data}async searchEvents(e,t={}){return(await this.client.get(`/api/conversations/${e}/events/search`,{params:t})).data}async getEvent(e,t){return(await this.client.get(`/api/conversations/${e}/events/${t}`)).data}async getEvents(e,t){return Promise.all(t.map(async t=>{try{return await this.getEvent(e,t)}catch(e){if(e instanceof n&&e.status===404)return null;throw e}}))}async sendEvent(e,t,n={}){await this.client.post(`/api/conversations/${e}/events`,{...t,...n.run===void 0?{}:{run:n.run}})}async pauseConversation(e){return(await this.client.post(`/api/conversations/${e}/pause`,{})).data}async interruptConversation(e){return(await this.client.post(`/api/conversations/${e}/interrupt`,{})).data}async runConversation(e){return(await this.client.post(`/api/conversations/${e}/run`,{})).data}async startGoal(e,t){return(await this.client.post(`/api/conversations/${e}/goal`,t)).data}async stopGoal(e){return(await this.client.post(`/api/conversations/${e}/goal/stop`,{})).data}async resumeGoal(e){return(await this.client.post(`/api/conversations/${e}/goal/resume`,{})).data}async askAgent(e,t){return(await this.client.post(`/api/conversations/${e}/ask_agent`,{question:t})).data}async getEventCount(e,t={}){return(await this.client.get(`/api/conversations/${e}/events/count`,{params:t})).data}async respondToConfirmation(e,t){return(await this.client.post(`/api/conversations/${e}/events/respond_to_confirmation`,t)).data}async getAgentFinalResponse(e){return(await this.client.get(`/api/conversations/${e}/agent_final_response`)).data}async setConfirmationPolicy(e,t){let n=`policy`in t?t:{policy:t};return(await this.client.post(`/api/conversations/${e}/confirmation_policy`,n)).data}async condenseConversation(e){return(await this.client.post(`/api/conversations/${e}/condense`,{})).data}async setSecurityAnalyzer(e,t){let n=b(t)?t:{security_analyzer:t};return(await this.client.post(`/api/conversations/${e}/security_analyzer`,n)).data}async updateSecrets(e,t){return(await this.client.post(`/api/conversations/${e}/secrets`,t)).data}async forkConversation(e,t={},n={}){return(await this.client.post(`/api/conversations/${e}/fork`,t,{params:n.includeSkills===void 0?void 0:{include_skills:n.includeSkills}})).data}async navigateConversation(e,t={},n={}){return(await this.client.post(`/api/conversations/${e}/navigate`,t,{params:n.includeSkills===void 0?void 0:{include_skills:n.includeSkills}})).data}async switchProfile(e,t){await this.client.post(`/api/conversations/${e}/switch_profile`,{profile_name:t})}async switchLLM(e,t){await this.client.post(`/api/conversations/${e}/switch_llm`,{llm:t})}async switchAcpModel(e,t){await this.client.post(`/api/conversations/${e}/switch_acp_model`,{model:t})}async deleteConversation(e){await this.client.delete(`/api/conversations/${e}`)}async updateConversation(e,t){return(await this.client.patch(`/api/conversations/${e}`,t)).data}close(){this.client.close()}};function b(e){return typeof e==`object`&&!!e&&`security_analyzer`in e}var x=class{constructor(e){let{serverClient:t,runtimeClient:n}=_(e);this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.runtimeClient=n,this.serverClient=t}async searchSubdirectories(e,t={}){return(await this.serverClient.get(`/api/file/search_subdirs`,{params:{path:e,page_id:t.pageId,limit:t.limit,include_hidden:t.includeHidden||void 0}})).data}async getHome(e={}){return(await this.serverClient.get(`/api/file/home`,{params:{include_hidden:e.includeHidden||void 0}})).data}async downloadFile(e){return(await this.runtimeClient.get(`/api/file/download`,{params:{path:e},responseType:`arrayBuffer`})).data}async downloadTextFile(e){return new TextDecoder().decode(await this.downloadFile(e))}async uploadFile(e,t,n){let r=new FormData,i=typeof File>`u`?void 0:File;return i&&e instanceof i?r.append(`file`,e,n||e.name):e instanceof Blob?r.append(`file`,e,n||`blob-file`):r.append(`file`,new Blob([e],{type:`text/plain`}),n||`text-file.txt`),(await this.runtimeClient.post(`/api/file/upload`,r,{params:{path:t}})).data}async uploadTextFile(e,t,n){return this.uploadFile(e,t,n)}async downloadTrajectory(e){return(await this.runtimeClient.get(`/api/file/download-trajectory/${encodeURIComponent(e)}`,{responseType:`blob`})).data}close(){this.runtimeClient.close()}},S=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async loadHooks(e={}){return await p(this.client,s.hooks),(await this.client.post(`/api/hooks`,e)).data}close(){this.client.close()}},C=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getProviders(){return(await this.client.get(`/api/llm/providers`)).data.providers}async getModels(e){return(await this.client.get(`/api/llm/models`,{params:e?{provider:e}:void 0})).data.models}async getVerifiedModels(){return(await this.client.get(`/api/llm/models/verified`)).data.models}async getOpenAISubscriptionModels(){return(await this.client.get(`/api/llm/subscription/openai/models`)).data.models}async getOpenAISubscriptionStatus(){return(await this.client.get(`/api/llm/subscription/openai/status`)).data}async startOpenAISubscriptionDeviceLogin(){return(await this.client.post(`/api/llm/subscription/openai/device/start`)).data}async pollOpenAISubscriptionDeviceLogin(e){let t={device_code:e};return(await this.client.post(`/api/llm/subscription/openai/device/poll`,t)).data}async logoutOpenAISubscription(){return(await this.client.post(`/api/llm/subscription/openai/logout`)).data}close(){this.client.close()}},w=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async testServer(e){return await p(this.client,s.mcpTest),(await this.client.post(`/api/mcp/test`,e,{timeout:(e.timeout??15)*1e3+5e3})).data}async startOAuth(e){return await p(this.client,s.mcpOAuth),(await this.client.post(`/api/mcp/oauth/start`,e,{timeout:(e.timeout??15)*1e3+5e3})).data}async getOAuthStatus(e){return await p(this.client,s.mcpOAuth),(await this.client.get(`/api/mcp/oauth/status/${encodeURIComponent(e)}`)).data}async submitOAuthCallback(e,t){return await p(this.client,s.mcpOAuth),(await this.client.post(`/api/mcp/oauth/callback/${encodeURIComponent(e)}`,t)).data}close(){this.client.close()}},T=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async listProfiles(){return(await this.client.get(`/api/profiles`)).data}async getProfile(e,t={}){let n={};return t.exposeSecrets&&(n[`X-Expose-Secrets`]=t.exposeSecrets),(await this.client.get(`/api/profiles/${encodeURIComponent(e)}`,{headers:n})).data}async saveProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}`,t)).data}async deleteProfile(e){return(await this.client.delete(`/api/profiles/${encodeURIComponent(e)}`)).data}async renameProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}/rename`,{new_name:t})).data}async activateProfile(e){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}/activate`,{})).data}async validateProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}/validate`,t)).data}close(){this.client.close()}},E=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async listMetaProfiles(){return(await this.client.get(`/api/meta-profiles`)).data}async getMetaProfile(e){return(await this.client.get(`/api/meta-profiles/${encodeURIComponent(e)}`)).data}async saveMetaProfile(e,t){return(await this.client.post(`/api/meta-profiles/${encodeURIComponent(e)}`,t)).data}async deleteMetaProfile(e){return(await this.client.delete(`/api/meta-profiles/${encodeURIComponent(e)}`)).data}async activateMetaProfile(e){return(await this.client.post(`/api/meta-profiles/${encodeURIComponent(e)}/activate`,{})).data}close(){this.client.close()}},D=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getAgentSchema(){return(await this.client.get(`/api/settings/agent-schema`)).data}async getSettings(e={}){return(await this.client.get(`/api/settings`,{headers:e.exposeSecrets?{"X-Expose-Secrets":e.exposeSecrets}:void 0})).data}async updateSettings(e){return(await this.client.patch(`/api/settings`,e)).data}async createMcpServer(e,t){return(await this.client.post(`/api/settings/mcp/${encodeURIComponent(e)}`,t)).data}async patchMcpServer(e,t){return(await this.client.patch(`/api/settings/mcp/${encodeURIComponent(e)}`,t)).data}async deleteMcpServer(e){return(await this.client.delete(`/api/settings/mcp/${encodeURIComponent(e)}`)).data}async listSecrets(e={}){return(await this.client.get(`/api/settings/secrets`,{params:e.agentProfileId?{agent_profile_id:e.agentProfileId}:void 0})).data}async upsertSecret(e){return(await this.client.put(`/api/settings/secrets`,e)).data}async getSecret(e){return(await this.client.get(`/api/settings/secrets/${encodeURIComponent(e)}`,{responseType:`text`})).data}async deleteSecret(e){return(await this.client.delete(`/api/settings/secrets/${encodeURIComponent(e)}`)).data}async getConversationSchema(){return(await this.client.get(`/api/settings/conversation-schema`)).data}async listProfiles(){return(await this.client.get(`/api/profiles`)).data}async getProfile(e,t={}){return(await this.client.get(`/api/profiles/${encodeURIComponent(e)}`,{headers:t.exposeSecrets?{"X-Expose-Secrets":t.exposeSecrets}:void 0})).data}async saveProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}`,t)).data}async deleteProfile(e){return(await this.client.delete(`/api/profiles/${encodeURIComponent(e)}`)).data}async renameProfile(e,t){return(await this.client.post(`/api/profiles/${encodeURIComponent(e)}/rename`,{new_name:t})).data}close(){this.client.close()}},O=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getSkills(e={}){return(await this.client.post(`/api/skills`,e)).data}async syncSkills(){return(await this.client.post(`/api/skills/sync`,{})).data}async installSkill(e){return(await this.client.post(`/api/skills/install`,e)).data}async listInstalledSkills(){return(await this.client.get(`/api/skills/installed`)).data}async getInstalledSkill(e){return(await this.client.get(`/api/skills/installed/${encodeURIComponent(e)}`)).data}async toggleSkill(e,t){return(await this.client.patch(`/api/skills/installed/${encodeURIComponent(e)}`,{enabled:t})).data}async uninstallSkill(e){return(await this.client.delete(`/api/skills/installed/${encodeURIComponent(e)}`)).data}async refreshSkill(e){return(await this.client.post(`/api/skills/installed/${encodeURIComponent(e)}/refresh`)).data}async getMarketplace(){return(await this.client.get(`/api/skills/marketplace`)).data}close(){this.client.close()}},k=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getSubAgents(e={}){return(await this.client.post(`/api/sub-agents`,e)).data}close(){this.client.close()}},A=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getPlugins(e={}){return(await this.client.post(`/api/plugins`,e)).data}async getPluginsMarketplace(){return(await this.client.get(`/api/plugins/marketplace`)).data}async installPlugin(e){return(await this.client.post(`/api/plugins/install`,e)).data}async listInstalledPlugins(){return(await this.client.get(`/api/plugins/installed`)).data}async getInstalledPlugin(e){return(await this.client.get(`/api/plugins/installed/${encodeURIComponent(e)}`)).data}async setPluginEnabled(e,t){return(await this.client.patch(`/api/plugins/installed/${encodeURIComponent(e)}`,{enabled:t})).data}async uninstallPlugin(e){return(await this.client.delete(`/api/plugins/installed/${encodeURIComponent(e)}`)).data}async refreshPlugin(e){return(await this.client.post(`/api/plugins/installed/${encodeURIComponent(e)}/refresh`)).data}close(){this.client.close()}},j=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async listTools(){return(await this.client.get(`/api/tools/`)).data}close(){this.client.close()}},M=class{constructor(e){let{runtimeClient:t}=_(e);this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=t}async getUrl(e={}){return(await this.client.get(`/api/vscode/url`,{params:{...e.baseUrl?{base_url:e.baseUrl}:{},...e.workspaceDir?{workspace_dir:e.workspaceDir}:{}}})).data.url}async getStatus(){return(await this.client.get(`/api/vscode/status`)).data}close(){this.client.close()}},N=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getSharedConversations(e){return(await this.client.get(`/api/shared-conversations`,{params:{ids:e}})).data}async getSharedConversation(e){return(await this.getSharedConversations([e]))[0]??null}async searchSharedEvents(e){return(await this.client.get(`/api/shared-events/search`,{params:{conversation_id:e.conversationId,limit:e.limit,page_id:e.pageId}})).data}close(){this.client.close()}},P=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async listWorkspaces(){return await this.ensureWorkspacesSupported(),(await this.client.get(`/api/workspaces`)).data}async addWorkspaces(e){return await this.ensureWorkspacesSupported(),(await this.client.post(`/api/workspaces`,{workspaces:e})).data}async deleteWorkspace(e){return await this.ensureWorkspacesSupported(),(await this.client.delete(`/api/workspaces`,{params:{path:e}})).data}async addWorkspaceParents(e){return await this.ensureWorkspacesSupported(),(await this.client.post(`/api/workspaces/parents`,{parents:e})).data}async deleteWorkspaceParent(e){return await this.ensureWorkspacesSupported(),(await this.client.delete(`/api/workspaces/parents`,{params:{path:e}})).data}close(){this.client.close()}async ensureWorkspacesSupported(){await p(this.client,s.workspaces)}},F=class{constructor(e){this.host=e.host.replace(/\/+$/,``),this.apiKey=e.apiKey,this.timeout=e.timeout||6e4}get(e,t={}){return this.request({...t,method:`GET`,path:e})}post(e,t,n={}){return this.request({...n,method:`POST`,path:e,body:t})}patch(e,t,n={}){return this.request({...n,method:`PATCH`,path:e,body:t})}put(e,t,n={}){return this.request({...n,method:`PUT`,path:e,body:t})}delete(e,t={}){return this.request({...t,method:`DELETE`,path:e})}close(){}},I=class extends F{constructor(e){super(e),this.kind=`agent-server`;let t={host:this.host,apiKey:this.apiKey,timeout:this.timeout};this.client=new r({baseUrl:this.host,apiKey:this.apiKey,timeout:this.timeout}),this.server=new a(t),this.conversations=new y(t),this.files=new x(t),this.bash=new v(t),this.settings=new D(t),this.profiles=new T(t),this.agentProfiles=new i(t),this.metaProfiles=new E(t),this.skills=new O(t),this.subAgents=new k(t),this.hooks=new S(t),this.mcp=new w(t),this.plugins=new A(t),this.tools=new j(t),this.vscode=new M(t),this.shared=new N(t),this.llm=new C(t),this.workspaces=new P(t)}async request(e){let t=e.hostOverride?.replace(/\/+$/,``)??this.host,n=e.authMode===`none`?void 0:e.authMode===`session-api-key`?e.sessionApiKey??void 0:this.apiKey;return(await(t===this.host&&n===this.apiKey?this.client:new r({baseUrl:t,apiKey:n,timeout:this.timeout})).request({method:e.method,url:e.path,params:e.params,data:e.body,headers:e.headers,timeout:e.timeoutSeconds?e.timeoutSeconds*1e3:this.timeout,acceptableStatusCodes:e.acceptableStatusCodes,responseType:e.responseType})).data}close(){this.client.close()}},L=class e extends Error{constructor(t,n){super(t),this.code=n,this.name=`DeviceFlowError`,Object.setPrototypeOf(this,e.prototype)}},ee=6e5,R=3e4;function z(e){try{let t=e.trim().toLowerCase(),n=/^https?:\/\//i.test(t)?t:`https://${t}`,r=new URL(n).hostname;return r.endsWith(`.all-hands.dev`)||r===`all-hands.dev`||r.endsWith(`.openhands.dev`)||r===`openhands.dev`}catch{return!1}}function B(e){return e.replace(/\/+$/,``)}async function V(e,t,n,r,i,a){let o=typeof n==`string`||n instanceof Blob||n instanceof FormData||n instanceof URLSearchParams?n:JSON.stringify(n),s=new Headers(a);return s.set(`Content-Type`,r),fetch(`${B(e)}${t}`,{method:`POST`,headers:s,body:o,signal:i})}async function H(e,t={}){try{let n=await V(e,`/oauth/device/authorize`,{},`application/json`,void 0,t.headers);if(!n.ok)throw new L(`Failed to start device flow: Server returned ${n.status}`);let r=await n.json();if(!r.device_code||!r.user_code||!r.verification_uri)throw new L(`Invalid response from device authorization endpoint: missing required fields`);return{device_code:r.device_code,user_code:r.user_code,verification_uri:r.verification_uri,verification_uri_complete:r.verification_uri_complete??`${r.verification_uri}?user_code=${encodeURIComponent(r.user_code)}`,expires_in:r.expires_in??600,interval:r.interval??5}}catch(e){throw e instanceof L?e:new L(`Failed to start device flow: ${e instanceof Error?e.message:String(e)}`)}}async function U(e,t,n){let r=n.timeout??ee,i=Math.max(1,n.interval)*1e3,a=Date.now();for(;Date.now()-a<r;){if(n.signal?.aborted)throw new L(`Authorization cancelled`,`cancelled`);try{let r=await V(e,`/oauth/device/token`,new URLSearchParams({grant_type:`urn:ietf:params:oauth:grant-type:device_code`,device_code:t}),`application/x-www-form-urlencoded`,n.signal,n.headers);if(r.ok){let e=await r.json();if(!e.access_token)throw new L(`Invalid token response: missing access_token`);return{access_token:e.access_token,token_type:e.token_type??`Bearer`,expires_in:e.expires_in}}let a;try{a=await r.json()}catch{throw new L(`Unexpected response from server: ${r.status}`)}switch(a.error){case`authorization_pending`:break;case`slow_down`:i=typeof a.interval==`number`&&Number.isFinite(a.interval)&&a.interval>0?Math.max(1,Math.min(a.interval,30))*1e3:Math.min(i+5e3,R);break;case`expired_token`:throw new L(`Device code has expired. Please try again.`,`expired_token`);case`access_denied`:throw new L(`Authorization request was denied.`,`access_denied`);default:throw new L(`Authorization error: ${a.error}${a.error_description?` - ${a.error_description}`:``}`,a.error)}}catch(e){if(e instanceof L)throw e;if(e instanceof DOMException&&e.name===`AbortError`)throw new L(`Authorization cancelled`,`cancelled`);console.warn(`Network error during polling, retrying:`,e)}try{await W(i,n.signal)}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?new L(`Authorization cancelled`,`cancelled`):e}}throw new L(`Timeout waiting for authorization. Please try again.`,`timeout`)}function W(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=setTimeout(n,e);t?.addEventListener(`abort`,()=>{clearTimeout(i),r(new DOMException(`Aborted`,`AbortError`))},{once:!0})})}var G=`/api/v1/settings/profiles`,K=100,q=class extends F{constructor(e){super(e),this.kind=`cloud`,this.orgId=e.orgId??null,this.proxy=e.proxy?{...e.proxy,host:e.proxy.host.replace(/\/+$/,``),path:e.proxy.path??`/api/cloud-proxy`}:void 0}async request(e){return e.hostOverride?this.requestThroughProxy(e):this.requestDirect(e)}startDeviceFlow(e={}){return H(this.host,e)}pollForToken(e,t){return U(this.host,e,t)}async getOrganizations(){let e=await this.get(`/api/organizations`);return{items:e?.items??[],currentOrgId:e?.current_org_id??null}}getCurrentApiKey(){return this.get(`/api/keys/current`)}async getOrganizationMe(e){let t=await this.get(`/api/organizations/${encodeURIComponent(e)}/me`);return{orgId:t?.org_id??e,userId:t?.user_id??``,role:t?.role??null,permissions:Array.isArray(t?.permissions)?t.permissions:null}}getSettings(){return this.get(`/api/v1/settings`)}async getSettingsWithDerivedFields(){let e=await this.getSettings();return{...e,agent_settings:te(e),conversation_settings:ne(e),llm_api_key_set:!!e.llm_api_key_set,search_api_key_set:!!e.search_api_key_set,provider_tokens_set:e.provider_tokens_set}}async saveSettings(e){let t={};if(e.agent_settings_diff){let n={...e.agent_settings_diff};n.agent_context===null&&delete n.agent_context,Object.keys(n).length>0&&(t.agent_settings_diff=n)}if(e.conversation_settings_diff&&Object.keys(e.conversation_settings_diff).length>0&&(t.conversation_settings_diff=e.conversation_settings_diff),e.app_preferences)for(let[n,r]of Object.entries(e.app_preferences))r!==void 0&&(t[n]=r);await this.post(`/api/v1/settings`,t)}getSettingsSchema(){return this.get(`/api/v1/settings/agent-schema`)}getConversationSettingsSchema(){return this.get(`/api/v1/settings/conversation-schema`)}listProfiles(){return this.get(this.profileBasePath())}async getProfile(e){let t=await this.get(`${this.profileBasePath()}/${encodeURIComponent(e)}`);return{name:t.name,config:t.config??t.llm??{},api_key_set:t.api_key_set??!1}}saveProfile(e,t){return this.post(`${this.profileBasePath()}/${encodeURIComponent(e)}`,t)}deleteProfile(e){return this.delete(`${this.profileBasePath()}/${encodeURIComponent(e)}`)}renameProfile(e,t){return this.post(`${this.profileBasePath()}/${encodeURIComponent(e)}/rename`,{new_name:t})}async activateProfile(e){let t=await this.post(`${this.profileBasePath()}/${encodeURIComponent(e)}/activate`,{});return{name:t.name,message:t.message,llm_applied:t.model!=null||t.llm!=null}}async listSecrets(){let e=[],t=null;do{let n=new URLSearchParams({limit:String(K)});t&&n.set(`page_id`,t);let r=await this.get(`/api/v1/secrets/search?${n.toString()}`);e.push(...r.items??[]),t=r.next_page_id}while(t);return e}async createSecret(e,t,n){await this.post(`/api/v1/secrets`,{name:e,value:t,description:n})}async updateSecret(e,t,n){await this.put(`/api/v1/secrets/${encodeURIComponent(e)}`,{name:t,description:n})}async deleteSecret(e){await this.delete(`/api/v1/secrets/${encodeURIComponent(e)}`)}async listSkills(){let e=[],t=null;do{let n=new URLSearchParams({limit:String(K)});t&&n.set(`page_id`,t);let r=await this.get(`/api/v1/skills/search?${n.toString()}`);e.push(...r.items??[]),t=r.next_page_id}while(t);return e}searchRepositories(e){let t=new URLSearchParams;return t.set(`provider`,e.provider),t.set(`limit`,String(e.limit??100)),e.query&&t.set(`query`,e.query),e.pageId&&t.set(`page_id`,e.pageId),e.installationId&&t.set(`installation_id`,e.installationId),this.get(`/api/v1/git/repositories/search?${t.toString()}`)}getInstallations(e){let t=new URLSearchParams;return t.set(`provider`,e.provider),t.set(`limit`,String(e.limit??100)),e.pageId&&t.set(`page_id`,e.pageId),this.get(`/api/v1/git/installations/search?${t.toString()}`)}getRepositoryBranches(e){let t=new URLSearchParams;return t.set(`provider`,e.provider),t.set(`repository`,e.repository),t.set(`limit`,String(e.limit??30)),t.set(`query`,e.query??``),e.pageId&&t.set(`page_id`,e.pageId),this.get(`/api/v1/git/branches/search?${t.toString()}`)}getSuggestedTasks(e={}){let t=new URLSearchParams;return t.set(`limit`,String(e.limit??30)),e.pageId&&t.set(`page_id`,e.pageId),this.get(`/api/v1/git/suggested-tasks/search?${t.toString()}`)}searchModels(e){return this.get(`/api/v1/config/models/search${Q(e)}`)}searchProviders(e){return this.get(`/api/v1/config/providers/search${Q(e)}`)}searchConversations(e=20,t){let n=new URLSearchParams;return n.set(`limit`,String(e)),t&&n.set(`page_id`,t),n.set(`sort_order`,`UPDATED_AT_DESC`),this.get(`/api/v1/app-conversations/search?${n.toString()}`)}getConversations(e){if(e.length===0)return Promise.resolve([]);let t=new URLSearchParams;for(let n of e)t.append(`ids`,n);return this.get(`/api/v1/app-conversations?${t}`)}createConversation(e){return this.post(`/api/v1/app-conversations`,e)}downloadConversation(e){return this.get(`/api/v1/app-conversations/${e}/download`,{responseType:`blob`})}async deleteConversation(e){await this.delete(`/api/v1/app-conversations/${e}`)}updateConversationPublicFlag(e,t){return this.patch(`/api/v1/app-conversations/${e}`,{public:t})}async pauseSandbox(e){await this.post(`/api/v1/sandboxes/${e}/pause`,{})}async resumeSandbox(e){await this.post(`/api/v1/sandboxes/${e}/resume`,{})}getSandboxes(e){if(e.length===0)return Promise.resolve([]);let t=new URLSearchParams;for(let n of e)t.append(`id`,n);return this.get(`/api/v1/sandboxes?${t}`)}readConversationFile(e,t){let n=new URLSearchParams({file_path:t});return this.get(`/api/v1/app-conversations/${e}/file?${n}`,{responseType:`text`})}async getConversationStartTask(e){let t=new URLSearchParams;return t.append(`ids`,e),(await this.get(`/api/v1/app-conversations/start-tasks?${t}`))?.[0]??null}async switchConversationProfile(e,t){await this.post(`/api/v1/app-conversations/${e}/switch_profile`,{profile_name:t})}async switchConversationAcpModel(e,t){await this.post(`/api/v1/app-conversations/${e}/switch_acp_model`,{model:t})}async listAutomations(e=50,t=0){return this.get(`/api/automation/v1?${$(e,t)}`)}getAutomation(e){return this.get(`/api/automation/v1/${encodeURIComponent(e)}`)}updateAutomation(e,t){return this.patch(`/api/automation/v1/${encodeURIComponent(e)}`,t)}async deleteAutomation(e){await this.delete(`/api/automation/v1/${encodeURIComponent(e)}`)}dispatchAutomation(e){return this.post(`/api/automation/v1/${encodeURIComponent(e)}/dispatch`)}listAutomationRuns(e,t=50,n=0){return this.get(`/api/automation/v1/${encodeURIComponent(e)}/runs?${$(t,n)}`)}downloadAutomationTarball(e){return this.get(`/api/automation/v1/${encodeURIComponent(e)}/tarball`,{responseType:`blob`})}getAutomationHealth(){return this.get(`/api/automation/health`,{timeoutSeconds:5})}profileBasePath(){return this.orgId?`/api/organizations/${encodeURIComponent(this.orgId)}/profiles`:G}buildUpstreamAuthHeaders(e){let t=e.authMode??`bearer`;return t===`none`?{}:t===`session-api-key`?e.sessionApiKey?{"X-Session-API-Key":e.sessionApiKey}:{}:this.apiKey?{Authorization:`Bearer ${this.apiKey}`}:{}}async requestDirect(e){let t={...this.buildUpstreamAuthHeaders(e),...this.orgId?{"X-Org-Id":this.orgId}:{},...e.headers??{}};return J({host:this.host,method:e.method,path:e.path,params:e.params,body:e.body,headers:t,timeoutMs:e.timeoutSeconds?e.timeoutSeconds*1e3:this.timeout,acceptableStatusCodes:e.acceptableStatusCodes,responseType:e.responseType})}async requestThroughProxy(e){if(!this.proxy)throw Error(`CloudClient proxy options are required for hostOverride requests`);let t={...this.buildUpstreamAuthHeaders(e),...this.orgId?{"X-Org-Id":this.orgId}:{},...e.headers??{}},n={"Content-Type":`application/json`,...this.proxy.apiKey?{"X-Session-API-Key":this.proxy.apiKey}:{},...this.proxy.headers??{}},r=this.proxy.path??`/api/cloud-proxy`;return J({host:this.proxy.host,method:`POST`,path:r,body:{host:e.hostOverride,method:e.method,path:Z(e.path,e.params),headers:t,body:e.body??null,...e.timeoutSeconds?{timeout_seconds:e.timeoutSeconds}:{}},headers:n,timeoutMs:this.timeout,acceptableStatusCodes:e.acceptableStatusCodes,responseType:e.responseType})}};async function J(e){let t=`${e.host.replace(/\/+$/,``)}${Z(e.path,e.params)}`,n={...e.body instanceof FormData?{}:{"Content-Type":`application/json`},...e.headers??{}},r={method:e.method,headers:n,signal:AbortSignal.timeout(e.timeoutMs)};e.body!==void 0&&e.method!==`GET`&&(r.body=e.body instanceof FormData?e.body:JSON.stringify(e.body));let i;try{i=await fetch(t,r)}catch(t){throw t instanceof Error&&(t.name===`TimeoutError`||t.name===`AbortError`)?Error(`Request timeout after ${e.timeoutMs}ms`,{cause:t}):t}if(!(e.acceptableStatusCodes?.has(i.status)||!e.acceptableStatusCodes&&i.ok))throw await Y(i);return X(i,e.responseType??`auto`)}async function Y(e){let t;try{t=e.headers.get(`content-type`)?.includes(`application/json`)?await e.json():await e.text()}catch{t=null}return new n(e.status,e.statusText,t,`HTTP request failed (${e.status} ${e.statusText}): ${JSON.stringify(t)}`)}async function X(e,t){if(e.status===204)return;if(t===`blob`)return await e.blob();if(t===`arrayBuffer`)return await e.arrayBuffer();if(t===`text`)return await e.text();let n=e.headers.get(`content-type`);return t===`json`||n?.includes(`application/json`)?await e.json():await e.text()}function Z(e,t){if(!t)return e;let[n,r=``]=e.split(`?`),i=new URLSearchParams(r);for(let[e,n]of Object.entries(t))n!=null&&(Array.isArray(n)?n.forEach(t=>i.append(e,String(t))):i.append(e,String(n)));let a=i.toString();return a?`${n}?${a}`:n}function Q(e){let t=new URLSearchParams;for(let[n,r]of Object.entries(e))r!==void 0&&t.set(n,String(r));let n=t.toString();return n?`?${n}`:``}function $(e,t){let n=new URLSearchParams;return n.set(`limit`,String(e)),n.set(`offset`,String(t)),n.toString()}function te(e){if(e.agent_settings&&Object.keys(e.agent_settings).length>0)return e.agent_settings;let t={},n={};typeof e.llm_model==`string`&&(n.model=e.llm_model),typeof e.llm_base_url==`string`&&(n.base_url=e.llm_base_url),typeof e.llm_api_key==`string`&&(n.api_key=e.llm_api_key),Object.keys(n).length>0&&(t.llm=n);let r={};return typeof e.enable_default_condenser==`boolean`&&(r.enabled=e.enable_default_condenser),typeof e.condenser_max_size==`number`&&(r.max_size=e.condenser_max_size),Object.keys(r).length>0&&(t.condenser=r),typeof e.agent==`string`&&(t.agent=e.agent),e.mcp_config&&Object.keys(e.mcp_config).length>0&&(t.mcp_config=e.mcp_config),t}function ne(e){if(e.conversation_settings&&Object.keys(e.conversation_settings).length>0)return e.conversation_settings;let t={};return typeof e.confirmation_mode==`boolean`&&(t.confirmation_mode=e.confirmation_mode),(typeof e.security_analyzer==`string`||e.security_analyzer===null)&&(t.security_analyzer=e.security_analyzer),typeof e.max_iterations==`number`&&(t.max_iterations=e.max_iterations),t}export{i as C,a as S,n as T,x as _,H as a,_ as b,N as c,O as d,D as f,S as g,C as h,U as i,M as l,w as m,L as n,I as o,T as p,z as r,P as s,q as t,A as u,y as v,r as w,u as x,v as y};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var e=[{id:`github`,name:`GitHub`,description:`Search code, manage issues and pull requests, and inspect repos via the GitHub API.`,categories:[`Engineering`,`Source control`],appUrl:`https://github.com`,docsUrl:`https://github.com/github/github-mcp-server`,notes:`Current managed connector works with bearer tokens today; GitHub OAuth is a strong candidate for a future one-click connect flow.`,popularityRank:100,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`account`,resourceType:`organization`,resourceCardinality:`many`,selectionMode:`post_auth`,identityMapping:{source:`identity_api`,endpoint:`https://api.github.com/user`,externalPrincipalIdPath:`id`,resourceNamePath:`login`,resourceUrlPath:`html_url`},resourceDiscovery:{endpoint:`https://api.github.com/user/orgs`,externalResourceIdPath:`id`,resourceNamePath:`login`,resourceUrlPath:`html_url`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,scopes:[`read:user`,`repo`]}},transport:{kind:`shttp`,url:`https://api.githubcopilot.com/mcp/`}},{id:`api`,provider:`mcp`,transport:{kind:`shttp`,url:`https://api.githubcopilot.com/mcp/`},auth:{strategy:`api_key`,credentialLabel:`Personal access token`,credentialPlaceholder:`github_pat_...`,credentialHelp:`Create a token in [GitHub settings](https://github.com/settings/personal-access-tokens): classic tokens need the repo and read:user scopes; fine-grained tokens need read access to Contents, Issues, and Pull requests for the repositories you use.`,credentialSecretName:`GITHUB_PERSONAL_ACCESS_TOKEN`,saveCredentialAsSecretByDefault:!0}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/github/FFFFFF`,keywords:[`git`,`pr`,`repo`,`issues`,`code`]},{id:`slack`,name:`Slack`,description:`Read channels, post messages, and search workspace history from your agent.`,categories:[`Communication`,`Operations`],appUrl:`https://slack.com`,docsUrl:`https://github.com/zencoderai/slack-mcp-server`,notes:`The OAuth option uses Slack's official hosted MCP server (confidential OAuth user-token auth); the local option runs the open-source zencoderai stdio server with a bot token.`,popularityRank:95,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`resource`,resourceType:`workspace`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`oauth_token_response`,externalPrincipalIdPath:`authed_user.id`,externalTenantIdPath:`enterprise.id`,externalResourceIdPath:`team.id`,resourceNamePath:`team.name`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://slack.com/oauth/v2_user/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.user.access`,scopes:[`search:read.public`,`search:read.private`,`search:read.mpim`,`search:read.im`,`search:read.files`,`search:read.users`,`chat:write`,`channels:history`,`groups:history`,`mpim:history`,`im:history`,`canvases:read`,`canvases:write`,`users:read`,`users:read.email`],pkce:!0,clientAuthentication:`body`}},transport:{kind:`shttp`,url:`https://mcp.slack.com/mcp`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`slack`,command:`npx`,args:[`-y`,`@zencoderai/slack-mcp-server`],envFields:[{key:`SLACK_TEAM_ID`,label:`Team / Workspace ID`,type:`text`,placeholder:`T01234567`,helperText:`First get your [Slack URL](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-url). Then use that to get your [Workspace ID](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-workspace-or-org-id).`,required:!0},{key:`SLACK_BOT_TOKEN`,label:`Bot token`,type:`password`,placeholder:`xoxb-...`,required:!0,helperText:`You'll need to create or have access to a [Slack App](https://github.com/zencoderai/slack-mcp-server#slack-bot-setup) to get a Bot token.`}]},auth:{strategy:`api_key`}}],iconBg:`#4A154B`,logoUrl:`https://cdn.jsdelivr.net/gh/OpenHands/extensions/integrations/icons/slack.svg`,keywords:[`chat`,`messaging`,`team`],installHint:`Create a Slack app with bot token scopes channels:history, channels:read, chat:write, reactions:write, users:read, and users.profile:read, then paste its bot token below.`},{id:`tavily`,name:`Tavily`,description:`Production-grade web search optimized for LLM agents. Free tier available.`,docsUrl:`https://github.com/tavily-ai/tavily-mcp`,iconBg:`#2563EB`,keywords:[`search`,`web`,`browsing`,`research`],popularityRank:90,installHint:`Paste your Tavily API key - the official tavily-mcp package runs via npx.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`tavily`,command:`npx`,args:[`-y`,`tavily-mcp`],envFields:[{key:`TAVILY_API_KEY`,label:`Tavily API key`,type:`password`,placeholder:`tvly-...`,required:!0,helperText:`API key from your Tavily dashboard.`,helperLink:`https://app.tavily.com/home?tab=keys`}]},auth:{strategy:`api_key`}}]},{id:`atlassian`,name:`Atlassian (Jira & Confluence)`,description:`Search Jira issues, manage tickets, and read Confluence pages from your agent.`,categories:[`Project management`,`Documentation`],appUrl:`https://www.atlassian.com`,docsUrl:`https://mcp-atlassian.soomiles.com/docs/installation`,iconBg:`#0052CC`,logoUrl:`https://cdn.simpleicons.org/atlassian/FFFFFF`,keywords:[`jira`,`confluence`,`tickets`,`wiki`,`issues`,`sprint`],popularityRank:88,installHint:`Paste your Jira and/or Confluence URL and API token. The mcp-atlassian package runs via uvx - no install needed.`,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`account`,resourceType:`site`,resourceCardinality:`many`,selectionMode:`post_auth`,resourceDiscovery:{endpoint:`https://api.atlassian.com/oauth/token/accessible-resources`,externalResourceIdPath:`id`,resourceNamePath:`name`,resourceUrlPath:`url`}},transport:{kind:`shttp`,url:`https://mcp.atlassian.com/v1/mcp`},auth:{strategy:`oauth2`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`mcp-atlassian`,command:`uvx`,args:[`mcp-atlassian`],envFields:[{key:`JIRA_URL`,label:`Jira URL`,type:`text`,placeholder:`https://your-company.atlassian.net`,required:!1,helperText:`Your Atlassian Jira base URL. Omit if using Confluence only.`},{key:`JIRA_USERNAME`,label:`Jira username (email)`,type:`text`,placeholder:`your.email@company.com`,required:!1,helperText:`Email address linked to your Atlassian account.`},{key:`JIRA_API_TOKEN`,label:`Jira API token`,type:`password`,placeholder:`ATATT...`,required:!1,helperText:`Atlassian API token for Jira. Required when JIRA_URL is set.`,helperLink:`https://id.atlassian.com/manage-profile/security/api-tokens`},{key:`CONFLUENCE_URL`,label:`Confluence URL`,type:`text`,placeholder:`https://your-company.atlassian.net/wiki`,required:!1,helperText:`Your Atlassian Confluence base URL. Omit if using Jira only.`},{key:`CONFLUENCE_USERNAME`,label:`Confluence username (email)`,type:`text`,placeholder:`your.email@company.com`,required:!1,helperText:`Email address linked to your Atlassian account.`},{key:`CONFLUENCE_API_TOKEN`,label:`Confluence API token`,type:`password`,placeholder:`ATATT...`,required:!1,helperText:`Atlassian API token for Confluence. Required when CONFLUENCE_URL is set.`,helperLink:`https://id.atlassian.com/manage-profile/security/api-tokens`}]},auth:{strategy:`api_key`}}]},{id:`linear`,name:`Linear`,description:`Browse and update Linear issues, cycles, and projects from the agent.`,categories:[`Project management`,`Engineering`],appUrl:`https://linear.app`,docsUrl:`https://linear.app/docs/mcp`,notes:`Popular among modern product engineering teams and already useful to this repo's users.`,popularityRank:86,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://mcp.linear.app/authorize`,tokenUrl:`https://mcp.linear.app/token`,registrationUrl:`https://mcp.linear.app/register`,scopes:[`read`,`write`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.linear.app/mcp`},additionalTokenParams:{resource:`https://mcp.linear.app/mcp`}}},transport:{kind:`shttp`,url:`https://mcp.linear.app/mcp`}},{id:`api-key`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.linear.app/mcp`,apiKeyOptional:!0},auth:{strategy:`bearer`,apiKeyOptional:!0,credentialLabel:`Linear API key`,credentialPlaceholder:`Paste your Linear API key`,credentialHelp:`Create a personal API key (grant at least read access) under Security & access in [Linear settings](https://linear.app/settings/account/security). Sent as Authorization: Bearer <token>; optional when the endpoint accepts your OAuth session.`}}],iconBg:`#5E6AD2`,logoUrl:`https://cdn.simpleicons.org/linear/FFFFFF`,keywords:[`issues`,`project management`,`tasks`,`tickets`],installHint:`Prefer the OAuth MCP connection for Linear. The MCP server supports OAuth 2.1 with dynamic client registration at mcp.linear.app; a bearer-token MCP option remains available for API-key or existing OAuth-token workflows.`},{id:`notion`,name:`Notion`,description:`Read and edit Notion pages, databases, and blocks via Notion's MCP server.`,categories:[`Knowledge base`,`Documentation`],appUrl:`https://www.notion.so`,docsUrl:`https://developers.notion.com/docs/mcp`,popularityRank:82,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`resource`,resourceType:`workspace`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`oauth_token_response`,externalPrincipalIdPath:`owner.user.id`,externalResourceIdPath:`workspace_id`,resourceNamePath:`workspace_name`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,scopes:[]}},http:{apiBaseUrl:`https://api.notion.com`,openApiUrl:`https://developers.notion.com/openapi.json`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`notion`,command:`npx`,args:[`-y`,`@notionhq/notion-mcp-server`],envFields:[{key:`NOTION_TOKEN`,label:`Internal integration token`,type:`password`,placeholder:`ntn_...`,required:!0,helperText:`Internal integration token from your Notion integrations page.`,helperLink:`https://www.notion.so/profile/integrations`}]},auth:{strategy:`api_key`}}],iconBg:`#FFFFFF`,logoUrl:`https://cdn.simpleicons.org/notion/000000`,iconColor:`#000000`,keywords:[`docs`,`notes`,`wiki`,`knowledge base`]},{id:`vanta`,name:`Vanta`,description:`Query Vanta compliance controls, tests, evidence, risks, and vulnerabilities from the agent.`,categories:[`Security`,`Compliance`],appUrl:`https://www.vanta.com`,docsUrl:`https://developer.vanta.com/docs/vanta-mcp`,notes:`Vanta's hosted remote MCP server (beta, requires a Vanta Admin role). Regional endpoints: US https://mcp.vanta.com/mcp, EU https://mcp.eu.vanta.com/mcp, AUS https://mcp.aus.vanta.com/mcp. Authentication is OAuth only - no API keys.`,popularityRank:64,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.vanta.com/oauth/authorize`,tokenUrl:`https://api.vanta.com/oauth/token`,registrationUrl:`https://api.vanta.com/oauth/register`,scopes:[`mcp-api.all:read`],optionalScopes:[`mcp-api.all:write`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.vanta.com`},additionalTokenParams:{resource:`https://mcp.vanta.com`}}},transport:{kind:`shttp`,url:`https://mcp.vanta.com/mcp`}}],iconBg:`#003D2B`,keywords:[`compliance`,`soc2`,`security`,`audit`,`risk`,`vanta`],installHint:`Connect via the OAuth MCP option. After connecting, complete the OAuth flow in your browser as a Vanta Admin. EU tenants should use https://mcp.eu.vanta.com/mcp and AUS tenants https://mcp.aus.vanta.com/mcp as the transport URL. The legacy local server @vantasdk/vanta-mcp-server is deprecated - prefer the hosted remote server.`},{id:`gitlab`,name:`GitLab`,description:`Access projects, issues, merge requests, and CI/CD workflows through GitLab's official MCP server or API.`,categories:[`Engineering`,`Source control`],appUrl:`https://gitlab.com`,docsUrl:`https://docs.gitlab.com/user/model_context_protocol/mcp_server/`,notes:`Supports GitLab.com through either the official MCP server (beta) with OAuth or the API with a personal access token. For the OAuth MCP connection to work on GitLab.com, MCP server access must be enabled for a top-level group you belong to (set GitLab Duo availability to Always on or On by default for the top-level group, turn on beta and experimental features, and allow access to the MCP server); otherwise GitLab rejects the connection with a 404 after OAuth, which the client reports as 'Session terminated'. For GitLab Self-Managed, edit the MCP URL to your instance's server and the OAuth flow discovers the host-specific endpoints.`,popularityRank:60,connectionOptions:[{id:`api`,provider:`http`,auth:{strategy:`api_key`,apiKeyHeaderName:`PRIVATE-TOKEN`,credentialLabel:`Personal access token`,credentialPlaceholder:`glpat-...`,credentialHelp:`Create a token in [GitLab access token settings](https://gitlab.com/-/user_settings/personal_access_tokens) with the api scope.`,credentialSecretName:`GITLAB_TOKEN`,saveCredentialAsSecretByDefault:!0},http:{apiBaseUrl:`https://gitlab.com/api/v4`,openApiUrl:`https://gitlab.com/gitlab-org/gitlab/-/raw/master/doc/api/openapi/openapi_v2.yaml`}},{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{scopes:[`mcp`],pkce:!0,clientAuthentication:`none`}},transport:{kind:`shttp`,url:`https://gitlab.com/api/v4/mcp`,urlEditable:!0}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/gitlab/FC6D26`,keywords:[`git`,`merge request`,`repo`,`issues`,`code`,`mr`,`devops`],installHint:`The GitLab MCP server supports OAuth 2.0. Before installing, make sure an admin has enabled 'MCP client access' for the top-level GitLab group you belong to. If this prerequisite isn't met, GitLab returns 404 after OAuth and the connection fails with 'Session terminated'. For GitLab Self-Managed, edit the URL to https://<your-instance>/api/v4/mcp and make sure MCP server access is enabled for the instance.`},{id:`ordinal`,name:`Ordinal`,description:`Social media posts, profiles, analytics, labels, approvals, and engagements.`,categories:[`Social media`,`Marketing`],appUrl:`https://app.tryordinal.com`,docsUrl:`https://docs.tryordinal.com/api/mcp`,logoUrl:`https://app.tryordinal.com/favicon.ico`,notes:`Official MCP server backed by Ordinal's API with API-key (Bearer) auth.`,popularityRank:52,connectionOptions:[{id:`api`,provider:`mcp`,auth:{strategy:`bearer`,authModes:[`bearer`],credentialLabel:`Ordinal API key`,credentialPlaceholder:`Paste your Ordinal API key`,credentialHelp:`API key from your Ordinal workspace settings, sent as a Bearer token in the Authorization header.`},transport:{kind:`shttp`,url:`https://app.tryordinal.com/api/mcp`}}]},{id:`elevenlabs`,name:`ElevenLabs`,description:`Generate speech, clone voices, and transcribe audio via ElevenLabs.`,categories:[`Audio`,`AI`],appUrl:`https://elevenlabs.io`,docsUrl:`https://elevenlabs.io/docs/api-reference/mcp`,notes:`Official API-key connector backed by ElevenLabs' published OpenAPI spec.`,popularityRank:51,connectionOptions:[{id:`api`,provider:`http`,auth:{strategy:`api_key`,authModes:[`api_key`],credentialLabel:`ElevenLabs API key`,credentialPlaceholder:`Paste your ElevenLabs API key`,credentialHelp:`Personal or workspace ElevenLabs API key sent in the xi-api-key header.`,apiKeyHeaderName:`xi-api-key`},http:{apiBaseUrl:`https://api.elevenlabs.io`,openApiUrl:`https://api.elevenlabs.io/openapi.json`}}],iconBg:`var(--oh-color-base)`,logoUrl:`https://cdn.simpleicons.org/elevenlabs/FFFFFF`,keywords:[`tts`,`speech`,`voice`,`audio`]},{id:`bitbucket`,name:`Bitbucket`,description:`Repositories, pull requests, and Atlassian engineering workflows.`,categories:[`Engineering`,`Source control`],appUrl:`https://bitbucket.org`,docsUrl:`https://developer.atlassian.com/cloud/bitbucket/oauth-2/`,notes:`Popular in Atlassian-centric teams and complements Jira/Confluence.`,popularityRank:50,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://bitbucket.org/site/oauth2/authorize`,tokenUrl:`https://bitbucket.org/site/oauth2/access_token`,scopes:[`account`,`repository`]}},http:{apiBaseUrl:`https://api.bitbucket.org/2.0`,openApiUrl:`https://developer.atlassian.com/cloud/bitbucket/swagger.v3.json`}}]},{id:`xero`,name:`Xero`,description:`Accounting, contacts, invoices, and bookkeeping workflows.`,categories:[`Finance`,`Accounting`],appUrl:`https://www.xero.com`,docsUrl:`https://developer.xero.com/documentation/guides/oauth2/overview/`,notes:`Important accounting platform in many regions.`,popularityRank:48,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.xero.com/identity/connect/authorize`,tokenUrl:`https://identity.xero.com/connect/token`,scopes:[`accounting.contacts.read`]}},http:{apiBaseUrl:`https://api.xero.com/api.xro/2.0`,openApiUrl:`https://api.apis.guru/v2/specs/xero.com/xero_accounting/2.9.4/openapi.json`}}]},{id:`quickbooks`,name:`QuickBooks`,description:`Accounting, invoices, customers, and financial operations via the QuickBooks Online MCP server.`,categories:[`Finance`,`Accounting`],appUrl:`https://quickbooks.intuit.com`,docsUrl:`https://github.com/intuit/quickbooks-online-mcp-server`,notes:`Official Intuit QuickBooks Online MCP server runs locally over stdio after a one-time OAuth handshake.`,popularityRank:47,iconBg:`#2CA01C`,logoUrl:`https://cdn.simpleicons.org/quickbooks/FFFFFF`,keywords:[`accounting`,`finance`,`invoices`,`qbo`],installHint:`Create an app on the Intuit Developer Portal (developer.intuit.com), complete the one-time OAuth handshake (clone intuit/quickbooks-online-mcp-server, npm install, npm run build, npm run auth), then provide your Client ID/Secret, Refresh Token, and Realm ID. The server runs over stdio via npx from the official GitHub repo.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`quickbooks-online`,command:`npx`,args:[`-y`,`github:intuit/quickbooks-online-mcp-server`],envFields:[{key:`QUICKBOOKS_CLIENT_ID`,label:`QuickBooks OAuth Client ID`,type:`text`,placeholder:`your-intuit-app-client-id`,required:!0,helperText:`From the Intuit Developer Portal app you created.`,helperLink:`https://developer.intuit.com/`},{key:`QUICKBOOKS_CLIENT_SECRET`,label:`QuickBooks OAuth Client Secret`,type:`password`,placeholder:`your-intuit-app-client-secret`,required:!0,helperText:`From the Intuit Developer Portal app. Stored as a secret.`,helperLink:`https://developer.intuit.com/`},{key:`QUICKBOOKS_REFRESH_TOKEN`,label:`QuickBooks Refresh Token`,type:`password`,placeholder:`your-refresh-token`,required:!0,helperText:`Obtained after the one-time OAuth handshake (npm run auth). Auto-rotates; stored as a secret.`,helperLink:`https://github.com/intuit/quickbooks-online-mcp-server#authentication`},{key:`QUICKBOOKS_REALM_ID`,label:`QuickBooks Company (Realm) ID`,type:`text`,placeholder:`your-company-id`,required:!0,helperText:`The QBO company ID to connect to.`,helperLink:`https://github.com/intuit/quickbooks-online-mcp-server#authentication`},{key:`QUICKBOOKS_ENVIRONMENT`,label:`Environment`,type:`text`,placeholder:`sandbox`,required:!1,helperText:`sandbox or production (default: sandbox).`}]},auth:{strategy:`none`}}]},{id:`sonarqube`,name:`SonarQube`,description:`Inspect code quality and security findings, quality gates, and analyze code snippets from SonarQube Server or Cloud.`,categories:[`Engineering`,`Security`],appUrl:`https://www.sonarsource.com/products/sonarqube/mcp-server/`,docsUrl:`https://github.com/SonarSource/sonarqube-mcp-server`,notes:`Uses SonarSource's official SonarQube MCP Server, run locally as a Docker container. Provide a SonarQube user token. Set SONARQUBE_ORG for SonarQube Cloud, or SONARQUBE_URL for a self-managed SonarQube Server (or https://sonarqube.us for SonarQube Cloud US).`,popularityRank:43,installHint:`SONARQUBE_TOKEN is always required. For SonarQube Cloud, set your organization key in SONARQUBE_ORG. For a self-managed SonarQube Server, set SONARQUBE_URL to your server URL; for SonarQube Cloud US, set SONARQUBE_URL to https://sonarqube.us. Requires a container runtime such as Docker.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`sonarqube`,command:`docker`,args:[`run`,`--init`,`--pull=always`,`-i`,`--rm`,`-e`,`SONARQUBE_TOKEN`,`-e`,`SONARQUBE_ORG`,`-e`,`SONARQUBE_URL`,`sonarsource/sonarqube-mcp`],envFields:[{key:`SONARQUBE_TOKEN`,label:`SonarQube token`,type:`password`,required:!0,helperText:`User token generated in your SonarQube Server or Cloud account settings.`,helperLink:`https://docs.sonarsource.com/sonarqube-cloud/managing-your-account/managing-tokens/`},{key:`SONARQUBE_ORG`,label:`Organization key (SonarQube Cloud)`,type:`text`,required:!1,placeholder:`my-org`,helperText:`Required for SonarQube Cloud. Your organization key, found in SonarQube Cloud.`},{key:`SONARQUBE_URL`,label:`Server URL (SonarQube Server)`,type:`text`,required:!1,placeholder:`https://sonarqube.example.com`,helperText:`Required for a self-managed SonarQube Server. For SonarQube Cloud US, use https://sonarqube.us.`}]},auth:{strategy:`api_key`}}],iconBg:`#126ED3`,logoUrl:`https://cdn.simpleicons.org/sonarqubeserver/FFFFFF`,keywords:[`code quality`,`static analysis`,`security`,`sast`,`quality gate`,`sonarcloud`]},{id:`okta`,name:`Okta`,description:`Identity, users, applications, and access administration.`,categories:[`Identity`,`Enterprise`],appUrl:`https://www.okta.com`,docsUrl:`https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/`,notes:`High-value admin and security automation surface.`,popularityRank:42,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://{yourOktaDomain}/oauth2/v1/authorize`,tokenUrl:`https://{yourOktaDomain}/oauth2/v1/token`,scopes:[`okta.users.read`]}},http:{apiBaseUrl:`https://{yourOktaDomain}/api/v1`,openApiUrl:`https://raw.githubusercontent.com/okta/okta-sdk-java/master/src/swagger/api.yaml`}}]},{id:`netlify`,name:`Netlify`,description:`Sites, builds, deploy previews, and web operations.`,categories:[`Deployment`,`Developer tools`],appUrl:`https://www.netlify.com`,docsUrl:`https://docs.netlify.com/api/get-started/#oauth-applications`,notes:`Common alternative hosting/deployment automation target.`,popularityRank:40,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.netlify.com/authorize`,tokenUrl:`https://api.netlify.com/oauth/token`,scopes:[`sites:read`]}},http:{apiBaseUrl:`https://api.netlify.com/api/v1`,openApiUrl:`https://raw.githubusercontent.com/netlify/open-api/master/swagger.yml`}}]},{id:`vercel`,name:`Vercel`,description:`Deployments, projects, domains, and preview environment workflows.`,categories:[`Developer tools`,`Deployment`],appUrl:`https://vercel.com`,docsUrl:`https://vercel.com/docs/rest-api#oauth-apps`,notes:`Especially relevant to this repo's deployment model.`,popularityRank:39,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://vercel.com/oauth/authorize`,tokenUrl:`https://api.vercel.com/v2/oauth/access_token`,scopes:[`project:read`]}},http:{apiBaseUrl:`https://api.vercel.com`,openApiUrl:`https://api.apis.guru/v2/specs/vercel.com/0.0.1/openapi.json`}}]},{id:`supabase`,name:`Supabase`,description:`Query and manage your Supabase project, including database, auth, and storage.`,categories:[`Database`,`Developer tools`],appUrl:`https://supabase.com`,docsUrl:`https://supabase.com/docs/guides/getting-started/mcp`,notes:`Popular developer platform with broad automation value and a documented management-API OAuth integration flow.`,popularityRank:38,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`supabase`,command:`npx`,args:[`-y`,`@supabase/mcp-server-supabase@latest`],envFields:[{key:`SUPABASE_ACCESS_TOKEN`,label:`Supabase access token`,type:`password`,required:!0,helperText:`Personal access token from your Supabase dashboard.`,helperLink:`https://supabase.com/dashboard/account/tokens`}]},auth:{strategy:`api_key`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://api.supabase.com/v1/oauth/authorize`,tokenUrl:`https://api.supabase.com/v1/oauth/token`,scopes:[]}},http:{apiBaseUrl:`https://api.supabase.com/v1`,openApiUrl:`https://raw.githubusercontent.com/supabase/supabase/master/apps/docs/spec/api_v1_openapi.json`}}],iconBg:`#3ECF8E`,logoUrl:`https://cdn.simpleicons.org/supabase/FFFFFF`,keywords:[`database`,`auth`,`storage`,`postgres`]},{id:`posthog`,name:`PostHog`,description:`Product analytics, feature flags, and session insights.`,categories:[`Analytics`,`Product`],appUrl:`https://posthog.com`,docsUrl:`https://posthog.com/docs/model-context-protocol`,notes:`Uses PostHog's official hosted MCP server. OAuth is preferred; the bearer-token option remains for clients or deployments that require a personal API key. The OAuth URL defaults to read-only mode; remove readonly=true only when write access has been approved.`,popularityRank:37,iconBg:`#1D4AFF`,logoUrl:`https://cdn.simpleicons.org/posthog/FFFFFF`,keywords:[`analytics`,`feature flags`,`product`,`experiments`],installHint:`Prefer OAuth. The default OAuth connection uses read-only MCP mode; edit the URL or use the bearer-key fallback only when a workflow needs approved write access. For API keys, create a PostHog personal API key with the MCP Server preset.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://oauth.posthog.com/oauth/authorize/`,tokenUrl:`https://oauth.posthog.com/oauth/token/`,registrationUrl:`https://oauth.posthog.com/oauth/register/`,scopes:[`openid`,`profile`,`email`,`organization:read`,`project:read`,`dashboard:read`,`insight:read`,`query:read`,`event_definition:read`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.posthog.com/mcp`},additionalTokenParams:{resource:`https://mcp.posthog.com/mcp`}}},transport:{kind:`shttp`,url:`https://mcp.posthog.com/mcp?readonly=true`,urlEditable:!0}},{id:`api-key`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.posthog.com/mcp`},auth:{strategy:`bearer`,credentialLabel:`PostHog personal API key`,credentialPlaceholder:`Paste your PostHog personal API key`,credentialHelp:`Create one under PostHog > User settings > API keys using the MCP Server preset. Sent as Authorization: Bearer <token>.`,credentialSecretName:`POSTHOG_PERSONAL_API_KEY`,saveCredentialAsSecretByDefault:!0}}]},{id:`sentry`,name:`Sentry`,description:`Triage issues, inspect events, and run Seer fixes against your Sentry org.`,categories:[`Observability`,`Engineering`],appUrl:`https://sentry.io`,docsUrl:`https://docs.sentry.io/product/sentry-mcp/`,notes:`Natural target for engineering support agents.`,popularityRank:36,connectionOptions:[{id:`oauth-mcp`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.sentry.dev/mcp`},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://sentry.io/oauth/authorize`,tokenUrl:`https://sentry.io/oauth/token`,scopes:[`project:read`,`event:read`,`org:read`]}}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://sentry.io/oauth/authorize`,tokenUrl:`https://sentry.io/oauth/token`,scopes:[`project:read`,`event:read`,`org:read`]}},http:{apiBaseUrl:`https://sentry.io/api/0`,openApiUrl:`https://raw.githubusercontent.com/getsentry/sentry/master/api-docs/openapi.json`}}],iconBg:`#362D59`,logoUrl:`https://cdn.simpleicons.org/sentry/FFFFFF`,keywords:[`errors`,`observability`,`monitoring`,`crash`]},{id:`datadog`,name:`Datadog`,description:`Logs, metrics, monitors, incidents, and observability workflows.`,categories:[`Observability`,`Operations`],appUrl:`https://www.datadoghq.com`,docsUrl:`https://docs.datadoghq.com/mcp_server/setup/`,notes:`Uses Datadog's official hosted MCP server. The MCP endpoint host is site-specific: use https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (e.g. mcp.us5.datadoghq.com for US5). The default URL below targets US1 and can be edited in the install dialog.`,popularityRank:35,installHint:`The Datadog MCP URL is site-specific. Edit the URL to https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (for example https://mcp.us5.datadoghq.com/v1/mcp for US5, https://mcp.eu.datadoghq.com/v1/mcp for EU). Find your site at Organization Settings → Site in Datadog.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.datadoghq.com/oauth2/v1/authorize`,tokenUrl:`https://api.datadoghq.com/oauth2/v1/token`,scopes:[`dashboards_read`,`monitors_read`]}},transport:{kind:`shttp`,url:`https://mcp.datadoghq.com/v1/mcp`}},{id:`api`,provider:`mcp`,auth:{strategy:`none`},transport:{kind:`shttp`,url:`https://mcp.datadoghq.com/v1/mcp`,urlEditable:!0,headerFields:[{key:`DD-API-KEY`,label:`Datadog API key`,type:`password`,required:!0,placeholder:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,helperText:`Created in Datadog under Organization Settings → API Keys. Used to authenticate to the Datadog MCP server. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication).`},{key:`DD-APPLICATION-KEY`,label:`Datadog Application key`,type:`password`,required:!0,placeholder:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,helperText:`Created in Datadog under Organization Settings → Application Keys. Grants the MCP server access to your Datadog data. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication).`}]}}]},{id:`canva`,name:`Canva`,description:`Design content, brand assets, and marketing collateral workflows.`,categories:[`Design`,`Marketing`],appUrl:`https://www.canva.com`,docsUrl:`https://www.canva.dev/docs/connect/oauth/`,notes:`Broad creator and marketing adoption with OAuth-based apps.`,popularityRank:34,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{tokenUrl:`https://api.canva.com/rest/v1/oauth/token`,scopes:[],authorizationUrl:`https://www.canva.com/api/oauth/authorize`}},http:{apiBaseUrl:`https://api.canva.com/rest/v1`,openApiUrl:`https://raw.githubusercontent.com/canva-sdks/canva-connect-api-starter-kit/main/openapi/spec.yml`}}]},{id:`miro`,name:`Miro`,description:`Whiteboards, diagrams, notes, and workshop collaboration.`,categories:[`Whiteboard`,`Collaboration`],appUrl:`https://miro.com`,docsUrl:`https://developers.miro.com/docs/mcp-intro`,notes:`Strong visual collaboration target for design and product teams.`,popularityRank:33,iconBg:`#FFD02F`,logoUrl:`https://cdn.simpleicons.org/miro/05003B`,keywords:[`whiteboard`,`collaboration`,`diagrams`,`visual`],installHint:`Connect Miro's hosted MCP server with OAuth.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://miro.com/oauth/authorize`,tokenUrl:`https://api.miro.com/v1/oauth/token`,scopes:[`boards:read`]}},transport:{kind:`shttp`,url:`https://mcp.miro.com/`}}]},{id:`webflow`,name:`Webflow`,description:`CMS items, sites, and web publishing workflows.`,categories:[`CMS`,`Marketing`],appUrl:`https://webflow.com`,docsUrl:`https://developers.webflow.com/mcp/reference/getting-started`,notes:`Uses Webflow's official hosted MCP server and deployment-scoped MCP OAuth registration so each user can authorize their own sites and workspaces.`,popularityRank:32,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://mcp.webflow.com/oauth/authorize`,tokenUrl:`https://mcp.webflow.com/oauth/token`,scopes:[],pkce:!0,clientAuthentication:`none`,registrationUrl:`https://mcp.webflow.com/oauth/register`}},transport:{kind:`shttp`,url:`https://mcp.webflow.com/mcp`}}]},{id:`zoom`,name:`Zoom`,description:`Meetings, recordings, webinars, and scheduling operations.`,categories:[`Meetings`,`Calendar`],appUrl:`https://zoom.us`,docsUrl:`https://developers.zoom.us/docs/integrations/oauth/`,notes:`Frequently requested for scheduling and meeting summaries.`,popularityRank:31,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://zoom.us/oauth/authorize`,tokenUrl:`https://zoom.us/oauth/token`,scopes:[`meeting:read:user`]}},http:{apiBaseUrl:`https://api.zoom.us/v2`,openApiUrl:`https://api.apis.guru/v2/specs/zoom.us/2.0.0/openapi.json`}}]},{id:`discord`,name:`Discord`,description:`Guilds, channels, messages, and community operations.`,categories:[`Communication`,`Community`],appUrl:`https://discord.com`,docsUrl:`https://discord.com/developers/docs/topics/oauth2`,notes:`Useful for community automation and bot-assisted workflows.`,popularityRank:30,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://discord.com/oauth2/authorize`,tokenUrl:`https://discord.com/api/oauth2/token`,scopes:[`identify`,`guilds`]}},http:{apiBaseUrl:`https://discord.com/api/v10`,openApiUrl:`https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json`}}]},{id:`stripe`,name:`Stripe`,description:`Query customers, payments, subscriptions, and invoices via Stripe's hosted MCP server.`,categories:[`Payments`,`Finance`],appUrl:`https://stripe.com`,docsUrl:`https://stripe.com/docs/mcp`,notes:`High-value fintech automation target with mature OAuth patterns.`,popularityRank:28,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.stripe.com/`},auth:{strategy:`bearer`,credentialLabel:`Stripe restricted key`,credentialPlaceholder:`rk_live_...`,credentialHelp:`Create a Stripe restricted key for MCP access and paste it here.`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://connect.stripe.com/oauth/authorize`,tokenUrl:`https://connect.stripe.com/oauth/token`,scopes:[`read_only`]}},http:{apiBaseUrl:`https://api.stripe.com/v1`,openApiUrl:`https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json`}}],iconBg:`#635BFF`,logoUrl:`https://cdn.simpleicons.org/stripe/FFFFFF`,keywords:[`payments`,`billing`,`subscriptions`,`finance`]},{id:`intercom`,name:`Intercom`,description:`Customer support, conversations, inboxes, and CRM context.`,categories:[`Support`,`CRM`],appUrl:`https://www.intercom.com`,docsUrl:`https://developers.intercom.com/building-apps/docs/authentication-types`,notes:`Useful for customer-facing assistant workflows.`,popularityRank:27,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.intercom.com/oauth`,tokenUrl:`https://api.intercom.io/auth/eagle/token`,scopes:[`read_users`,`read_conversations`]}},http:{apiBaseUrl:`https://api.intercom.io`,openApiUrl:`https://raw.githubusercontent.com/intercom/Intercom-OpenAPI/main/descriptions/2.15/api.intercom.io.yaml`}}]},{id:`hubspot`,name:`HubSpot`,description:`CRM, marketing, tickets, and customer lifecycle workflows.`,categories:[`CRM`,`Marketing`],appUrl:`https://www.hubspot.com`,docsUrl:`https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server`,notes:`Uses HubSpot's official remote MCP server plus MCP auth apps with PKCE.`,popularityRank:25,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,credentialHelp:`Use the client ID and secret from a HubSpot MCP auth app (Development → MCP Auth Apps). Standard HubSpot OAuth apps and private apps will not authenticate with mcp.hubspot.com.`,oauth:{authorizationUrl:`https://mcp.hubspot.com/oauth/authorize/user`,tokenUrl:`https://mcp.hubspot.com/oauth/v3/token`,scopes:[],pkce:!0,clientAuthentication:`body`}},transport:{kind:`shttp`,url:`https://mcp.hubspot.com`}}]},{id:`salesforce`,name:`Salesforce`,description:`CRM records, accounts, opportunities, and sales operations.`,categories:[`CRM`,`Sales`],appUrl:`https://www.salesforce.com`,docsUrl:`https://developer.salesforce.com/docs/platform/hosted-mcp-servers`,notes:`Very common enterprise CRM and agent-assist target.`,popularityRank:24,iconBg:`#00A1E0`,logoUrl:`https://cdn.jsdelivr.net/gh/OpenHands/extensions/integrations/icons/salesforce.svg`,keywords:[`crm`,`sales`,`records`,`enterprise`],installHint:`Activate an MCP server in Salesforce Setup (API Catalog → MCP Servers), create an External Client App, then connect. Edit the URL to match your server and org (e.g. /sandbox/ for sandboxes).`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.salesforce.com/services/oauth2/authorize`,tokenUrl:`https://login.salesforce.com/services/oauth2/token`,scopes:[`refresh_token`],pkce:!0}},transport:{kind:`shttp`,url:`https://api.salesforce.com/platform/mcp/v1/platform/sobject-reads`,urlEditable:!0}}]},{id:`sharepoint`,name:`SharePoint`,description:`Sites, document libraries, lists, and intranet content.`,categories:[`Knowledge base`,`Enterprise`],appUrl:`https://www.microsoft.com/microsoft-365/sharepoint/collaboration`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Frequently requested for enterprise knowledge retrieval.`,popularityRank:23,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Sites.Read.All`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`onedrive`,name:`OneDrive`,description:`Cloud file access and document workflows through Microsoft Graph.`,categories:[`Storage`,`Documents`],appUrl:`https://www.microsoft.com/microsoft-365/onedrive/online-cloud-storage`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Useful for enterprise file automation and search.`,popularityRank:22,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Files.Read`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`microsoft-teams`,name:`Microsoft Teams`,description:`Chats, channels, meetings, and collaboration via Microsoft Graph.`,categories:[`Communication`,`Enterprise`],appUrl:`https://www.microsoft.com/microsoft-teams/group-chat-software`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Common enterprise chat target alongside Outlook.`,popularityRank:21,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Team.ReadBasic.All`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`microsoft-outlook`,name:`Microsoft Outlook`,description:`Mail, calendar, contacts, and meeting workflows through Microsoft Graph.`,categories:[`Email`,`Calendar`],appUrl:`https://www.microsoft.com/microsoft-365/outlook/email-and-calendar-software-microsoft-outlook`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`High-value Microsoft Graph integration surface for enterprise users.`,popularityRank:20,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Mail.Read`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`box`,name:`Box`,description:`Enterprise file storage, metadata, and collaboration.`,categories:[`Storage`,`Enterprise`],appUrl:`https://www.box.com`,docsUrl:`https://developer.box.com/guides/authentication/oauth2/`,notes:`Strong enterprise document-management footprint.`,popularityRank:19,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://account.box.com/api/oauth2/authorize`,tokenUrl:`https://api.box.com/oauth2/token`,scopes:[`root_readonly`,`item_read`]}},http:{apiBaseUrl:`https://api.box.com/2.0`,openApiUrl:`https://raw.githubusercontent.com/box/box-openapi/main/openapi.json`}}]},{id:`airtable`,name:`Airtable`,description:`List bases, query records, and update fields across your Airtable workspace.`,categories:[`Database`,`Operations`],appUrl:`https://airtable.com`,docsUrl:`https://github.com/domdomegg/airtable-mcp-server`,notes:`Very common internal-tools and operations automation surface.`,popularityRank:17,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`airtable`,command:`npx`,args:[`-y`,`airtable-mcp-server`],envFields:[{key:`AIRTABLE_API_KEY`,label:`Airtable personal access token`,type:`password`,required:!0,helperText:`Personal access token from your Airtable account.`,helperLink:`https://airtable.com/create/tokens`}]},auth:{strategy:`api_key`}}],iconBg:`#FCB400`,logoUrl:`https://cdn.simpleicons.org/airtable/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`spreadsheet`,`database`,`records`,`bases`]},{id:`monday`,name:`Monday.com`,description:`Boards, automations, and work management across teams.`,categories:[`Project management`,`Operations`],appUrl:`https://monday.com`,docsUrl:`https://monday.com/w/mcp`,notes:`High-demand operations platform with rich board APIs.`,popularityRank:16,iconBg:`#FF3D00`,keywords:[`project management`,`boards`,`work`,`operations`],installHint:`Connect monday.com's hosted MCP server with OAuth.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.monday.com/oauth2/authorize`,tokenUrl:`https://auth.monday.com/oauth2/token`,scopes:[`boards:read`]}},transport:{kind:`shttp`,url:`https://mcp.monday.com/mcp`}}]},{id:`trello`,name:`Trello`,description:`Boards, cards, checklists, and lightweight project planning.`,categories:[`Project management`,`Operations`],appUrl:`https://trello.com`,docsUrl:`https://developer.atlassian.com/cloud/trello/guides/rest-api/authorization/`,notes:`Trello now uses Atlassian OAuth2 (auth.atlassian.com) for API authorization.`,popularityRank:14,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://api.atlassian.com/oauth/token`,scopes:[`read`,`write`]}},http:{apiBaseUrl:`https://api.trello.com/1`,openApiUrl:`https://developer.atlassian.com/cloud/trello/swagger.v3.json`}}]},{id:`asana`,name:`Asana`,description:`Task management, projects, and work tracking.`,categories:[`Project management`,`Operations`],appUrl:`https://asana.com`,docsUrl:`https://developers.asana.com/docs/oauth`,notes:`Broad business adoption and straightforward OAuth app model.`,popularityRank:13,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.asana.com/-/oauth_authorize`,tokenUrl:`https://app.asana.com/-/oauth_token`,scopes:[`tasks:read`]}},http:{apiBaseUrl:`https://app.asana.com/api/1.0`,openApiUrl:`https://api.apis.guru/v2/specs/asana.com/1.0/openapi.json`}}]},{id:`confluence`,name:`Confluence`,description:`Wiki pages, spaces, and internal documentation search.`,categories:[`Documentation`,`Knowledge base`],appUrl:`https://www.atlassian.com/software/confluence`,docsUrl:`https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/`,notes:`Natural companion to Jira for software teams.`,popularityRank:11,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,scopes:[`read:page:confluence`]}},http:{apiBaseUrl:`https://api.atlassian.com/ex/confluence/{cloudId}`,openApiUrl:`https://developer.atlassian.com/cloud/confluence/swagger.v3.json`}}]},{id:`jira`,name:`Jira`,description:`Issue tracking, sprint workflows, and engineering program management.`,categories:[`Project management`,`Engineering`],appUrl:`https://www.atlassian.com/software/jira`,docsUrl:`https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/`,notes:`Very common MCP target for software teams and ticket automation.`,popularityRank:10,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,scopes:[`read:jira-work`]}},http:{apiBaseUrl:`https://api.atlassian.com/ex/jira/{cloudId}`,openApiUrl:`https://developer.atlassian.com/cloud/jira/platform/swagger.v3.json`}}]},{id:`google-calendar`,name:`Google Calendar`,description:`Calendar search, event scheduling, and meeting coordination.`,categories:[`Calendar`,`Scheduling`],appUrl:`https://workspace.google.com/products/calendar/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Strong personal productivity use case with mature OAuth flows.`,popularityRank:9,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/calendar.readonly`]}},http:{apiBaseUrl:`https://www.googleapis.com/calendar/v3`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/calendar/v3/openapi.json`}}]},{id:`gmail`,name:`Gmail`,description:`Mailbox search, drafting, sending, and thread triage.`,categories:[`Communication`,`Email`],appUrl:`https://workspace.google.com/products/gmail/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Popular agent workflow target for inbox triage and drafting.`,popularityRank:8,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/gmail.readonly`]}},http:{apiBaseUrl:`https://gmail.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/gmail/v1/openapi.json`}}]},{id:`google-sheets`,name:`Google Sheets`,description:`Spreadsheet reads, writes, formulas, and reporting workflows.`,categories:[`Spreadsheets`,`Analytics`],appUrl:`https://workspace.google.com/products/sheets/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`High-value automation surface for agent-driven reporting and structured edits.`,popularityRank:7,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/spreadsheets.readonly`]}},http:{apiBaseUrl:`https://sheets.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/sheets/v4/openapi.json`}}]},{id:`google-drive`,name:`Google Drive`,description:`File search, metadata, folders, and document discovery.`,categories:[`Storage`,`Documents`],appUrl:`https://workspace.google.com/products/drive/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Natural expansion of the Google Workspace surface beyond Google Docs.`,popularityRank:6,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/drive.metadata.readonly`]}},http:{apiBaseUrl:`https://www.googleapis.com/drive/v3`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/drive/v3/openapi.json`}}]},{id:`figma`,name:`Figma`,description:`Read Figma frames, components, and styles to ground UI work in your designs.`,categories:[`Design`,`Frontend`],appUrl:`https://www.figma.com`,docsUrl:`https://github.com/GLips/Figma-Context-MCP`,popularityRank:5,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`figma`,command:`npx`,args:[`-y`,`figma-developer-mcp`,`--stdio`],envFields:[{key:`FIGMA_API_KEY`,label:`Figma personal access token`,type:`password`,required:!0,helperText:`Personal access token from your Figma account settings.`,helperLink:`https://developers.figma.com/docs/rest-api/authentication/#personal-access-tokens`}]},auth:{strategy:`api_key`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,scopes:[`current_user:read`,`file_content:read`,`file_metadata:read`,`projects:read`]}},http:{apiBaseUrl:`https://api.figma.com`,openApiUrl:`https://raw.githubusercontent.com/figma/rest-api-spec/main/openapi/openapi.yaml`}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/figma/FFFFFF`,keywords:[`design`,`ui`,`frames`,`components`]},{id:`google-docs`,name:`Google Docs`,description:`Docs authoring and Google Workspace document automation.`,categories:[`Documents`,`Knowledge base`],appUrl:`https://workspace.google.com/products/docs/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Current managed connector accepts a Google access token manually; a full OAuth connect flow can remove token copy/paste.`,popularityRank:2,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/documents.readonly`]}},http:{apiBaseUrl:`https://docs.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/docs/v1/openapi.json`}}]},{id:`apify`,name:`Apify Actors`,description:`Run any of Apify's 5,000+ Actors (scrapers, automations) from the agent.`,docsUrl:`https://docs.apify.com/platform/integrations/mcp`,iconBg:`#10b981`,keywords:[`scraping`,`automation`,`crawl`,`actors`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`apify`,command:`npx`,args:[`-y`,`@apify/actors-mcp-server`],envFields:[{key:`APIFY_TOKEN`,label:`Apify token`,type:`password`,required:!0,helperText:`API token from your Apify account settings.`,helperLink:`https://console.apify.com/account/integrations`}]},auth:{strategy:`api_key`}}]},{id:`atlassian-rovo`,name:`Atlassian Rovo`,description:`Search, create, and update Jira issues, Confluence pages, Bitbucket repos, and Jira Service Management tickets - all through Atlassian's official hosted MCP server, powered by your Teamwork Graph.`,categories:[`Project management`,`Documentation`,`Engineering`],appUrl:`https://www.atlassian.com/rovo`,docsUrl:`https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-remote-mcp-server/`,notes:`OAuth 2.1 is handled entirely by the Atlassian Rovo MCP server. No client credentials required - sign in with your Atlassian account when the authentication flow starts.`,iconBg:`#0052CC`,logoUrl:`https://cdn.simpleicons.org/atlassian/FFFFFF`,keywords:[`atlassian`,`rovo`,`jira`,`confluence`,`bitbucket`,`jsm`,`tickets`,`wiki`,`issues`,`sprint`,`mcp`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.atlassian.com/v1/mcp/authv2`},auth:{strategy:`oauth2`,oauth:{clientAuthentication:`none`}}}]},{id:`brave-search`,name:`Brave Search`,description:`Privacy-first web and local search using the Brave Search API.`,docsUrl:`https://github.com/brave/brave-search-mcp-server`,iconBg:`#FB542B`,logoUrl:`https://cdn.simpleicons.org/brave/FFFFFF`,keywords:[`search`,`web`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`brave_search`,command:`npx`,args:[`-y`,`@brave/brave-search-mcp-server`,`--transport`,`stdio`],envFields:[{key:`BRAVE_API_KEY`,label:`Brave API key`,type:`password`,required:!0,helperText:`API key from the Brave Search API portal.`,helperLink:`https://api-dashboard.search.brave.com/app/keys`}]},auth:{strategy:`api_key`}}]},{id:`browser-mcp`,name:`Browser MCP`,description:`Control your local browser tab — navigate, click, type, and read DOM contents.`,docsUrl:`https://browsermcp.io/`,iconBg:`#0EA5E9`,keywords:[`browser`,`automation`,`chrome`,`playwright`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`browser_mcp`,command:`npx`,args:[`-y`,`@browsermcp/mcp`]},auth:{strategy:`none`}}]},{id:`clickhouse`,name:`ClickHouse`,description:`Run analytical SQL queries against a ClickHouse cluster.`,docsUrl:`https://github.com/ClickHouse/mcp-clickhouse`,iconBg:`#FFFF00`,logoUrl:`https://cdn.simpleicons.org/clickhouse/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`analytics`,`olap`,`database`,`sql`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`clickhouse`,command:`uvx`,args:[`mcp-clickhouse`],envFields:[{key:`CLICKHOUSE_HOST`,label:`Host`,type:`text`,placeholder:`clickhouse.example.com`,required:!0},{key:`CLICKHOUSE_USER`,label:`Username`,type:`text`,required:!0},{key:`CLICKHOUSE_PASSWORD`,label:`Password`,type:`password`,required:!0,helperText:`Password for your ClickHouse user.`,helperLink:`https://clickhouse.com/docs/operations/access-rights`}]},auth:{strategy:`api_key`}}]},{id:`cloudflare-bindings`,name:`Cloudflare Workers Bindings`,description:`Inspect and manage KV, D1, R2, and Durable Object bindings on your Cloudflare account.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`workers`,`kv`,`d1`,`r2`,`durable objects`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://bindings.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-browser-rendering`,name:`Cloudflare Browser Rendering`,description:`Fetch and screenshot pages using Cloudflare's hosted browser rendering.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`browser`,`rendering`,`screenshots`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://browser.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-builds`,name:`Cloudflare Builds`,description:`Inspect Workers Builds — logs, statuses, and rerun failed deploys.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`workers`,`ci`,`builds`,`deploys`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://builds.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-docs`,name:`Cloudflare Docs`,description:`Search and reference Cloudflare's developer documentation directly from the agent.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`docs`,`reference`,`workers`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://docs.mcp.cloudflare.com/mcp`},auth:{strategy:`none`}}]},{id:`cloudflare-observability`,name:`Cloudflare Observability`,description:`Tail Workers logs and query observability data from your Cloudflare account.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`logs`,`tail`,`observability`,`workers`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://observability.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`deepwiki`,name:`DeepWiki`,description:`Ask grounded questions about any public GitHub repository via Devin's DeepWiki MCP.`,docsUrl:`https://docs.devin.ai/work-with-devin/deepwiki-mcp`,iconBg:`var(--oh-color-base)`,keywords:[`devin`,`code`,`wiki`,`github`,`docs`,`qa`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.deepwiki.com/mcp`},auth:{strategy:`none`}}]},{id:`everything`,name:`Everything (demo)`,description:`Reference server exercising every MCP capability — useful for testing.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/everything`,iconBg:`#6366F1`,keywords:[`demo`,`test`,`reference`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`everything`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-everything`]},auth:{strategy:`none`}}]},{id:`exa`,name:`Exa`,description:`Neural web search with semantic ranking, content extraction, and similar-page lookup.`,docsUrl:`https://docs.exa.ai/reference/exa-mcp`,iconBg:`var(--oh-surface)`,keywords:[`search`,`web`,`research`,`neural`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`exa`,command:`npx`,args:[`-y`,`exa-mcp-server`],envFields:[{key:`EXA_API_KEY`,label:`Exa API key`,type:`password`,required:!0,helperText:`API key from your Exa account.`,helperLink:`https://exa.ai/docs/reference/getting-started`}]},auth:{strategy:`api_key`}}]},{id:`fetch`,name:`Fetch`,description:`Plain HTTP fetcher: download a URL and convert HTML to readable markdown.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/fetch`,iconBg:`var(--oh-interactive-hover)`,keywords:[`http`,`web`,`url`,`scrape`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`fetch`,command:`uvx`,args:[`mcp-server-fetch`]},auth:{strategy:`none`}}]},{id:`filesystem`,name:`Filesystem`,description:`Give the agent secure, scoped filesystem access outside the workspace.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem`,iconBg:`var(--oh-interactive-hover)`,keywords:[`files`,`local`,`disk`],installHint:`Each path is exposed read/write. Add as many as you need, separated by spaces.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`filesystem`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-filesystem`],argFields:[{key:`paths`,label:`Paths (space separated)`,type:`text`,placeholder:`/Users/me/Documents /Users/me/Projects`,required:!0,helperText:`Each whitespace-separated token is appended as its own argument.`}]},auth:{strategy:`api_key`}}]},{id:`firecrawl`,name:`Firecrawl`,description:`Crawl any site and return clean markdown, structured data, or screenshots.`,docsUrl:`https://docs.firecrawl.dev/mcp`,iconBg:`#F97316`,keywords:[`scraping`,`crawl`,`web`,`markdown`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`firecrawl`,command:`npx`,args:[`-y`,`firecrawl-mcp`],envFields:[{key:`FIRECRAWL_API_KEY`,label:`Firecrawl API key`,type:`password`,required:!0,helperText:`API key from your Firecrawl dashboard.`,helperLink:`https://www.firecrawl.dev/app/api-keys`}]},auth:{strategy:`api_key`}}]},{id:`git`,name:`Git`,description:`Local git repository operations: log, diff, blame, status, and more.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/git`,iconBg:`#F1502F`,keywords:[`version control`,`log`,`diff`,`blame`],installHint:`Runs the official Python server via uvx — no setup beyond the path.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`git`,command:`uvx`,args:[`mcp-server-git`,`--repository`],argFields:[{key:`repo_path`,label:`Repository path`,type:`text`,placeholder:`/Users/me/code/my-repo`,required:!0,helperText:`Appended as --repository <path>.`}]},auth:{strategy:`api_key`}}]},{id:`huggingface`,name:`Hugging Face`,description:`Search models, datasets, and Spaces on the Hugging Face Hub from your agent.`,docsUrl:`https://huggingface.co/docs/huggingface_hub/en/guides/mcp`,iconBg:`#FFD21E`,logoUrl:`https://cdn.simpleicons.org/huggingface/000000`,iconColor:`#000000`,keywords:[`ml`,`models`,`datasets`,`ai`,`hub`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://huggingface.co/mcp`,apiKeyOptional:!0},auth:{strategy:`none`,apiKeyOptional:!0}}]},{id:`kagi`,name:`Kagi Search`,description:`Paid, privacy-first search with high signal-to-noise — great for research.`,docsUrl:`https://github.com/kagisearch/kagimcp`,iconBg:`#FFB319`,logoUrl:`https://cdn.simpleicons.org/kagi/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`search`,`web`,`privacy`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`kagi`,command:`uvx`,args:[`kagimcp`],envFields:[{key:`KAGI_API_KEY`,label:`Kagi API key`,type:`password`,required:!0,helperText:`API key from your Kagi account settings.`,helperLink:`https://kagi.com/settings?p=api`}]},auth:{strategy:`api_key`}}]},{id:`memory`,name:`Memory`,description:`Persistent key-value memory for the agent across conversations.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/memory`,iconBg:`#7C3AED`,keywords:[`memory`,`kv`,`state`,`persistence`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`memory`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-memory`]},auth:{strategy:`none`}}]},{id:`mongodb`,name:`MongoDB`,description:`Query MongoDB collections, inspect schemas, and run aggregation pipelines.`,docsUrl:`https://www.mongodb.com/docs/mcp-server/`,iconBg:`#00684A`,logoUrl:`https://cdn.simpleicons.org/mongodb/FFFFFF`,keywords:[`database`,`nosql`,`atlas`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`mongodb`,command:`npx`,args:[`-y`,`mongodb-mcp-server`],envFields:[{key:`MDB_MCP_CONNECTION_STRING`,label:`MongoDB connection string`,type:`password`,placeholder:`mongodb+srv://user:pass@cluster.mongodb.net`,required:!0,helperText:`Connection string from your MongoDB Atlas cluster.`,helperLink:`https://www.mongodb.com/docs/atlas/connect-to-database-deployment/#connect-with-a-connection-string`}]},auth:{strategy:`api_key`}}]},{id:`neon`,name:`Neon`,description:`Serverless Postgres: list projects, run queries, manage branches.`,docsUrl:`https://neon.com/docs/ai/neon-mcp-server`,iconBg:`#00E599`,iconColor:`var(--oh-surface-deep)`,keywords:[`database`,`postgres`,`serverless`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`neon`,command:`npx`,args:[`-y`,`@neondatabase/mcp-server-neon`,`start`],envFields:[{key:`NEON_API_KEY`,label:`Neon API key`,type:`password`,required:!0,helperText:`API key from your Neon account settings.`,helperLink:`https://neon.tech/docs/manage/api-keys`}]},auth:{strategy:`api_key`}}]},{id:`obsidian`,name:`Obsidian`,description:`Read and edit Markdown notes inside an Obsidian vault on the local disk.`,docsUrl:`https://github.com/MarkusPfundstein/mcp-obsidian`,iconBg:`#7C3AED`,logoUrl:`https://cdn.simpleicons.org/obsidian/FFFFFF`,keywords:[`notes`,`knowledge`,`markdown`,`vault`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`obsidian`,command:`uvx`,args:[`mcp-obsidian`],envFields:[{key:`OBSIDIAN_API_KEY`,label:`Local REST API key`,type:`password`,required:!0,helperText:`From the Obsidian 'Local REST API' community plugin.`,helperLink:`https://github.com/coddingtonbear/obsidian-local-rest-api`}]},auth:{strategy:`api_key`}}]},{id:`paypal`,name:`PayPal`,description:`Manage transactions and merchant data via PayPal's MCP server.`,docsUrl:`https://developer.paypal.com/tools/mcp-server/`,iconBg:`#003087`,logoUrl:`https://cdn.simpleicons.org/paypal/FFFFFF`,keywords:[`payments`,`billing`,`finance`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.paypal.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`playwright`,name:`Playwright`,description:`Headless-browser automation backed by Microsoft Playwright.`,docsUrl:`https://github.com/microsoft/playwright-mcp`,iconBg:`#2EAD33`,keywords:[`browser`,`automation`,`e2e`,`testing`,`scrape`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`playwright`,command:`npx`,args:[`-y`,`@playwright/mcp`]},auth:{strategy:`none`}}]},{id:`redis`,name:`Redis`,description:`Get, set, scan, and inspect data on a Redis or Redis-compatible instance.`,docsUrl:`https://github.com/redis/mcp-redis`,iconBg:`#DC382D`,logoUrl:`https://cdn.simpleicons.org/redis/FFFFFF`,keywords:[`cache`,`kv`,`database`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`redis`,command:`uvx`,args:[`--from`,`redis-mcp-server@latest`,`redis-mcp-server`,`--url`],argFields:[{key:`redis_url`,label:`Redis URL`,type:`password`,placeholder:`redis://localhost:6379`,required:!0,helperText:`Connection URL for your Redis instance. Appended as --url <redis_url>.`,helperLink:`https://redis.io/docs/latest/operate/rc/databases/connect/`}]},auth:{strategy:`api_key`}}]},{id:`resend`,name:`Resend`,description:`Send transactional and marketing emails via the Resend API.`,docsUrl:`https://resend.com/docs/mcp`,iconBg:`var(--oh-surface-deep)`,logoUrl:`https://cdn.simpleicons.org/resend/FFFFFF`,keywords:[`email`,`transactional`,`smtp`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`resend`,command:`npx`,args:[`-y`,`mcp-send-email`],envFields:[{key:`RESEND_API_KEY`,label:`Resend API key`,type:`password`,required:!0,helperText:`API key from your Resend dashboard.`,helperLink:`https://resend.com/api-keys`},{key:`SENDER_EMAIL_ADDRESS`,label:`From address`,type:`text`,placeholder:`you@example.com`,required:!0}]},auth:{strategy:`api_key`}}]},{id:`sequential-thinking`,name:`Sequential Thinking`,description:`Lets the agent emit and revise a chain of structured thoughts.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking`,iconBg:`var(--oh-color-base)`,keywords:[`reasoning`,`planning`,`thoughts`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`sequential_thinking`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-sequential-thinking`]},auth:{strategy:`none`}}]},{id:`superhuman-mail`,name:`Superhuman Mail`,description:`Search, read, draft, and send email via Superhuman's hosted MCP server.`,categories:[`Communication`,`Email`],appUrl:`https://superhuman.com`,docsUrl:`https://github.com/superhuman/mcp-mail`,notes:`OAuth is handled by the Superhuman MCP server itself (mcp-remote). No client credentials required.`,connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.mail.superhuman.com/mcp`},auth:{strategy:`oauth2`,oauth:{clientAuthentication:`none`}}}],iconBg:`#FF5C28`,logoUrl:`https://cdn.simpleicons.org/superhuman/FFFFFF`,keywords:[`email`,`mail`,`superhuman`,`inbox`]},{id:`time`,name:`Time`,description:`Timezone-aware current time, conversions, and timestamp formatting.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/time`,iconBg:`var(--oh-surface)`,keywords:[`clock`,`timezone`,`date`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`time`,command:`uvx`,args:[`mcp-server-time`]},auth:{strategy:`none`}}]}],t=e=>JSON.parse(JSON.stringify(e)),n=e;new Map(n.map(e=>[e.id,e]));var r=t(n);export{r as t};
|
|
1
|
+
var e=[{id:`github`,name:`GitHub`,description:`Search code, manage issues and pull requests, and inspect repos via the GitHub API.`,categories:[`Engineering`,`Source control`],appUrl:`https://github.com`,docsUrl:`https://github.com/github/github-mcp-server`,notes:`Current managed connector works with bearer tokens today; GitHub OAuth is a strong candidate for a future one-click connect flow.`,popularityRank:100,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`account`,resourceType:`organization`,resourceCardinality:`many`,selectionMode:`post_auth`,identityMapping:{source:`identity_api`,endpoint:`https://api.github.com/user`,externalPrincipalIdPath:`id`,resourceNamePath:`login`,resourceUrlPath:`html_url`},resourceDiscovery:{endpoint:`https://api.github.com/user/orgs`,externalResourceIdPath:`id`,resourceNamePath:`login`,resourceUrlPath:`html_url`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,scopes:[`read:user`,`repo`]}},transport:{kind:`shttp`,url:`https://api.githubcopilot.com/mcp/`}},{id:`api`,provider:`mcp`,transport:{kind:`shttp`,url:`https://api.githubcopilot.com/mcp/`},auth:{strategy:`api_key`,credentialLabel:`Personal access token`,credentialPlaceholder:`github_pat_...`,credentialHelp:`Create a token in [GitHub settings](https://github.com/settings/personal-access-tokens): classic tokens need the repo and read:user scopes; fine-grained tokens need read access to Contents, Issues, and Pull requests for the repositories you use.`,credentialSecretName:`GITHUB_PERSONAL_ACCESS_TOKEN`,saveCredentialAsSecretByDefault:!0}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/github/FFFFFF`,keywords:[`git`,`pr`,`repo`,`issues`,`code`]},{id:`slack`,name:`Slack`,description:`Read channels, post messages, and search workspace history from your agent.`,categories:[`Communication`,`Operations`],appUrl:`https://slack.com`,docsUrl:`https://github.com/zencoderai/slack-mcp-server`,notes:`The OAuth option uses Slack's official hosted MCP server (confidential OAuth user-token auth); the local option runs the open-source zencoderai stdio server with a bot token.`,popularityRank:95,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`resource`,resourceType:`workspace`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`oauth_token_response`,externalPrincipalIdPath:`authed_user.id`,externalTenantIdPath:`enterprise.id`,externalResourceIdPath:`team.id`,resourceNamePath:`team.name`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://slack.com/oauth/v2_user/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.user.access`,scopes:[`search:read.public`,`search:read.private`,`search:read.mpim`,`search:read.im`,`search:read.files`,`search:read.users`,`chat:write`,`channels:history`,`groups:history`,`mpim:history`,`im:history`,`canvases:read`,`canvases:write`,`users:read`,`users:read.email`],pkce:!0,clientAuthentication:`body`}},transport:{kind:`shttp`,url:`https://mcp.slack.com/mcp`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`slack`,command:`npx`,args:[`-y`,`@zencoderai/slack-mcp-server`],envFields:[{key:`SLACK_TEAM_ID`,label:`Team / Workspace ID`,type:`text`,placeholder:`T01234567`,helperText:`First get your [Slack URL](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-url). Then use that to get your [Workspace ID](https://slack.com/help/articles/221769328-Locate-your-Slack-URL-or-ID#find-your-workspace-or-org-id).`,required:!0},{key:`SLACK_BOT_TOKEN`,label:`Bot token`,type:`password`,placeholder:`xoxb-...`,required:!0,helperText:`You'll need to create or have access to a [Slack App](https://github.com/zencoderai/slack-mcp-server#slack-bot-setup) to get a Bot token.`}]},auth:{strategy:`api_key`}}],iconBg:`#4A154B`,logoUrl:`https://cdn.jsdelivr.net/gh/OpenHands/extensions/integrations/icons/slack.svg`,keywords:[`chat`,`messaging`,`team`],installHint:`Create a Slack app with bot token scopes channels:history, channels:read, chat:write, reactions:write, users:read, and users.profile:read, then paste its bot token below.`},{id:`tavily`,name:`Tavily`,description:`Production-grade web search optimized for LLM agents. Free tier available.`,docsUrl:`https://github.com/tavily-ai/tavily-mcp`,iconBg:`#2563EB`,keywords:[`search`,`web`,`browsing`,`research`],popularityRank:90,installHint:`Paste your Tavily API key - the official tavily-mcp package runs via npx.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`tavily`,command:`npx`,args:[`-y`,`tavily-mcp`],envFields:[{key:`TAVILY_API_KEY`,label:`Tavily API key`,type:`password`,placeholder:`tvly-...`,required:!0,helperText:`API key from your Tavily dashboard.`,helperLink:`https://app.tavily.com/home?tab=keys`}]},auth:{strategy:`api_key`}}]},{id:`atlassian`,name:`Atlassian (Jira & Confluence)`,description:`Search Jira issues, manage tickets, and read Confluence pages from your agent.`,categories:[`Project management`,`Documentation`],appUrl:`https://www.atlassian.com`,docsUrl:`https://mcp-atlassian.soomiles.com/docs/installation`,iconBg:`#0052CC`,logoUrl:`https://cdn.simpleicons.org/atlassian/FFFFFF`,keywords:[`jira`,`confluence`,`tickets`,`wiki`,`issues`,`sprint`],popularityRank:88,installHint:`Paste your Jira and/or Confluence URL and API token. The mcp-atlassian package runs via uvx - no install needed.`,connectionOptions:[{id:`oauth`,provider:`mcp`,connectionModel:{principalType:`user`,credentialScope:`account`,resourceType:`site`,resourceCardinality:`many`,selectionMode:`post_auth`,resourceDiscovery:{endpoint:`https://api.atlassian.com/oauth/token/accessible-resources`,externalResourceIdPath:`id`,resourceNamePath:`name`,resourceUrlPath:`url`}},transport:{kind:`shttp`,url:`https://mcp.atlassian.com/v1/mcp`},auth:{strategy:`oauth2`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`mcp-atlassian`,command:`uvx`,args:[`mcp-atlassian`],envFields:[{key:`JIRA_URL`,label:`Jira URL`,type:`text`,placeholder:`https://your-company.atlassian.net`,required:!1,helperText:`Your Atlassian Jira base URL. Omit if using Confluence only.`},{key:`JIRA_USERNAME`,label:`Jira username (email)`,type:`text`,placeholder:`your.email@company.com`,required:!1,helperText:`Email address linked to your Atlassian account.`},{key:`JIRA_API_TOKEN`,label:`Jira API token`,type:`password`,placeholder:`ATATT...`,required:!1,helperText:`Atlassian API token for Jira. Required when JIRA_URL is set.`,helperLink:`https://id.atlassian.com/manage-profile/security/api-tokens`},{key:`CONFLUENCE_URL`,label:`Confluence URL`,type:`text`,placeholder:`https://your-company.atlassian.net/wiki`,required:!1,helperText:`Your Atlassian Confluence base URL. Omit if using Jira only.`},{key:`CONFLUENCE_USERNAME`,label:`Confluence username (email)`,type:`text`,placeholder:`your.email@company.com`,required:!1,helperText:`Email address linked to your Atlassian account.`},{key:`CONFLUENCE_API_TOKEN`,label:`Confluence API token`,type:`password`,placeholder:`ATATT...`,required:!1,helperText:`Atlassian API token for Confluence. Required when CONFLUENCE_URL is set.`,helperLink:`https://id.atlassian.com/manage-profile/security/api-tokens`}]},auth:{strategy:`api_key`}}]},{id:`linear`,name:`Linear`,description:`Browse and update Linear issues, cycles, and projects from the agent.`,categories:[`Project management`,`Engineering`],appUrl:`https://linear.app`,docsUrl:`https://linear.app/docs/mcp`,notes:`Popular among modern product engineering teams and already useful to this repo's users.`,popularityRank:86,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://mcp.linear.app/authorize`,tokenUrl:`https://mcp.linear.app/token`,registrationUrl:`https://mcp.linear.app/register`,scopes:[`read`,`write`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.linear.app/mcp`},additionalTokenParams:{resource:`https://mcp.linear.app/mcp`}}},transport:{kind:`shttp`,url:`https://mcp.linear.app/mcp`}},{id:`api-key`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.linear.app/mcp`,apiKeyOptional:!0},auth:{strategy:`bearer`,apiKeyOptional:!0,credentialLabel:`Linear API key`,credentialPlaceholder:`Paste your Linear API key`,credentialHelp:`Create a personal API key (grant at least read access) under Security & access in [Linear settings](https://linear.app/settings/account/security). Sent as Authorization: Bearer <token>; optional when the endpoint accepts your OAuth session.`}}],iconBg:`#5E6AD2`,logoUrl:`https://cdn.simpleicons.org/linear/FFFFFF`,keywords:[`issues`,`project management`,`tasks`,`tickets`],installHint:`Prefer the OAuth MCP connection for Linear. The MCP server supports OAuth 2.1 with dynamic client registration at mcp.linear.app; a bearer-token MCP option remains available for API-key or existing OAuth-token workflows.`},{id:`notion`,name:`Notion`,description:`Read and edit Notion pages, databases, and blocks via Notion's MCP server.`,categories:[`Knowledge base`,`Documentation`],appUrl:`https://www.notion.so`,docsUrl:`https://developers.notion.com/docs/mcp`,popularityRank:82,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`resource`,resourceType:`workspace`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`oauth_token_response`,externalPrincipalIdPath:`owner.user.id`,externalResourceIdPath:`workspace_id`,resourceNamePath:`workspace_name`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,scopes:[]}},http:{apiBaseUrl:`https://api.notion.com`,openApiUrl:`https://developers.notion.com/openapi.json`}},{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`notion`,command:`npx`,args:[`-y`,`@notionhq/notion-mcp-server`],envFields:[{key:`NOTION_TOKEN`,label:`Internal integration token`,type:`password`,placeholder:`ntn_...`,required:!0,helperText:`Internal integration token from your Notion integrations page.`,helperLink:`https://www.notion.so/profile/integrations`}]},auth:{strategy:`api_key`}}],iconBg:`#FFFFFF`,logoUrl:`https://cdn.simpleicons.org/notion/000000`,iconColor:`#000000`,keywords:[`docs`,`notes`,`wiki`,`knowledge base`]},{id:`vanta`,name:`Vanta`,description:`Query Vanta compliance controls, tests, evidence, risks, and vulnerabilities from the agent.`,categories:[`Security`,`Compliance`],appUrl:`https://www.vanta.com`,docsUrl:`https://developer.vanta.com/docs/vanta-mcp`,notes:`Vanta's hosted remote MCP server (beta, requires a Vanta Admin role). Regional endpoints: US https://mcp.vanta.com/mcp, EU https://mcp.eu.vanta.com/mcp, AUS https://mcp.aus.vanta.com/mcp. Authentication is OAuth only - no API keys.`,popularityRank:64,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.vanta.com/oauth/authorize`,tokenUrl:`https://api.vanta.com/oauth/token`,registrationUrl:`https://api.vanta.com/oauth/register`,scopes:[`mcp-api.all:read`],optionalScopes:[`mcp-api.all:write`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.vanta.com`},additionalTokenParams:{resource:`https://mcp.vanta.com`}}},transport:{kind:`shttp`,url:`https://mcp.vanta.com/mcp`}}],iconBg:`#003D2B`,keywords:[`compliance`,`soc2`,`security`,`audit`,`risk`,`vanta`],installHint:`Connect via the OAuth MCP option. After connecting, complete the OAuth flow in your browser as a Vanta Admin. EU tenants should use https://mcp.eu.vanta.com/mcp and AUS tenants https://mcp.aus.vanta.com/mcp as the transport URL. The legacy local server @vantasdk/vanta-mcp-server is deprecated - prefer the hosted remote server.`},{id:`gitlab`,name:`GitLab`,description:`Access projects, issues, merge requests, and CI/CD workflows through GitLab's official MCP server or API.`,categories:[`Engineering`,`Source control`],appUrl:`https://gitlab.com`,docsUrl:`https://docs.gitlab.com/user/model_context_protocol/mcp_server/`,notes:`Supports GitLab.com through either the official MCP server (beta) with OAuth or the API with a personal access token. For the OAuth MCP connection to work on GitLab.com, MCP server access must be enabled for a top-level group you belong to (set GitLab Duo availability to Always on or On by default for the top-level group, turn on beta and experimental features, and allow access to the MCP server); otherwise GitLab rejects the connection with a 404 after OAuth, which the client reports as 'Session terminated'. For GitLab Self-Managed, edit the MCP URL to your instance's server and the OAuth flow discovers the host-specific endpoints.`,popularityRank:60,connectionOptions:[{id:`api`,provider:`http`,auth:{strategy:`api_key`,apiKeyHeaderName:`PRIVATE-TOKEN`,credentialLabel:`Personal access token`,credentialPlaceholder:`glpat-...`,credentialHelp:`Create a token in [GitLab access token settings](https://gitlab.com/-/user_settings/personal_access_tokens) with the api scope.`,credentialSecretName:`GITLAB_TOKEN`,saveCredentialAsSecretByDefault:!0},http:{apiBaseUrl:`https://gitlab.com/api/v4`,openApiUrl:`https://gitlab.com/gitlab-org/gitlab/-/raw/master/doc/api/openapi/openapi_v2.yaml`}},{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{scopes:[`mcp`],pkce:!0,clientAuthentication:`none`}},transport:{kind:`shttp`,url:`https://gitlab.com/api/v4/mcp`,urlEditable:!0}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/gitlab/FC6D26`,keywords:[`git`,`merge request`,`repo`,`issues`,`code`,`mr`,`devops`],installHint:`The GitLab MCP server supports OAuth 2.0. Before installing, make sure an admin has enabled 'MCP client access' for the top-level GitLab group you belong to. If this prerequisite isn't met, GitLab returns 404 after OAuth and the connection fails with 'Session terminated'. For GitLab Self-Managed, edit the URL to https://<your-instance>/api/v4/mcp and make sure MCP server access is enabled for the instance.`},{id:`ordinal`,name:`Ordinal`,description:`Social media posts, profiles, analytics, labels, approvals, and engagements.`,categories:[`Social media`,`Marketing`],appUrl:`https://app.tryordinal.com`,docsUrl:`https://docs.tryordinal.com/api/mcp`,logoUrl:`https://app.tryordinal.com/favicon.ico`,notes:`Official MCP server backed by Ordinal's API with API-key (Bearer) auth.`,popularityRank:52,connectionOptions:[{id:`api`,provider:`mcp`,auth:{strategy:`bearer`,authModes:[`bearer`],credentialLabel:`Ordinal API key`,credentialPlaceholder:`Paste your Ordinal API key`,credentialHelp:`API key from your Ordinal workspace settings, sent as a Bearer token in the Authorization header.`},transport:{kind:`shttp`,url:`https://app.tryordinal.com/api/mcp`}}]},{id:`elevenlabs`,name:`ElevenLabs`,description:`Generate speech, clone voices, and transcribe audio via ElevenLabs.`,categories:[`Audio`,`AI`],appUrl:`https://elevenlabs.io`,docsUrl:`https://elevenlabs.io/docs/api-reference/mcp`,notes:`Official API-key connector backed by ElevenLabs' published OpenAPI spec.`,popularityRank:51,connectionOptions:[{id:`api`,provider:`http`,auth:{strategy:`api_key`,authModes:[`api_key`],credentialLabel:`ElevenLabs API key`,credentialPlaceholder:`Paste your ElevenLabs API key`,credentialHelp:`Personal or workspace ElevenLabs API key sent in the xi-api-key header.`,apiKeyHeaderName:`xi-api-key`},http:{apiBaseUrl:`https://api.elevenlabs.io`,openApiUrl:`https://api.elevenlabs.io/openapi.json`}}],iconBg:`var(--oh-color-base)`,logoUrl:`https://cdn.simpleicons.org/elevenlabs/FFFFFF`,keywords:[`tts`,`speech`,`voice`,`audio`]},{id:`bitbucket`,name:`Bitbucket`,description:`Repositories, pull requests, and Atlassian engineering workflows.`,categories:[`Engineering`,`Source control`],appUrl:`https://bitbucket.org`,docsUrl:`https://developer.atlassian.com/cloud/bitbucket/oauth-2/`,notes:`Popular in Atlassian-centric teams and complements Jira/Confluence.`,popularityRank:50,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://bitbucket.org/site/oauth2/authorize`,tokenUrl:`https://bitbucket.org/site/oauth2/access_token`,scopes:[`account`,`repository`]}},http:{apiBaseUrl:`https://api.bitbucket.org/2.0`,openApiUrl:`https://developer.atlassian.com/cloud/bitbucket/swagger.v3.json`}}]},{id:`xero`,name:`Xero`,description:`Accounting, contacts, invoices, and bookkeeping workflows.`,categories:[`Finance`,`Accounting`],appUrl:`https://www.xero.com`,docsUrl:`https://developer.xero.com/documentation/guides/oauth2/overview/`,notes:`Important accounting platform in many regions.`,popularityRank:48,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.xero.com/identity/connect/authorize`,tokenUrl:`https://identity.xero.com/connect/token`,scopes:[`accounting.contacts.read`]}},http:{apiBaseUrl:`https://api.xero.com/api.xro/2.0`,openApiUrl:`https://api.apis.guru/v2/specs/xero.com/xero_accounting/2.9.4/openapi.json`}}]},{id:`quickbooks`,name:`QuickBooks`,description:`Accounting, invoices, customers, and financial operations via the QuickBooks Online MCP server.`,categories:[`Finance`,`Accounting`],appUrl:`https://quickbooks.intuit.com`,docsUrl:`https://github.com/intuit/quickbooks-online-mcp-server`,notes:`Official Intuit QuickBooks Online MCP server runs locally over stdio after a one-time OAuth handshake.`,popularityRank:47,iconBg:`#2CA01C`,logoUrl:`https://cdn.simpleicons.org/quickbooks/FFFFFF`,keywords:[`accounting`,`finance`,`invoices`,`qbo`],installHint:`Create an app on the Intuit Developer Portal (developer.intuit.com), complete the one-time OAuth handshake (clone intuit/quickbooks-online-mcp-server, npm install, npm run build, npm run auth), then provide your Client ID/Secret, Refresh Token, and Realm ID. The server runs over stdio via npx from the official GitHub repo.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`quickbooks-online`,command:`npx`,args:[`-y`,`github:intuit/quickbooks-online-mcp-server`],envFields:[{key:`QUICKBOOKS_CLIENT_ID`,label:`QuickBooks OAuth Client ID`,type:`text`,placeholder:`your-intuit-app-client-id`,required:!0,helperText:`From the Intuit Developer Portal app you created.`,helperLink:`https://developer.intuit.com/`},{key:`QUICKBOOKS_CLIENT_SECRET`,label:`QuickBooks OAuth Client Secret`,type:`password`,placeholder:`your-intuit-app-client-secret`,required:!0,helperText:`From the Intuit Developer Portal app. Stored as a secret.`,helperLink:`https://developer.intuit.com/`},{key:`QUICKBOOKS_REFRESH_TOKEN`,label:`QuickBooks Refresh Token`,type:`password`,placeholder:`your-refresh-token`,required:!0,helperText:`Obtained after the one-time OAuth handshake (npm run auth). Auto-rotates; stored as a secret.`,helperLink:`https://github.com/intuit/quickbooks-online-mcp-server#authentication`},{key:`QUICKBOOKS_REALM_ID`,label:`QuickBooks Company (Realm) ID`,type:`text`,placeholder:`your-company-id`,required:!0,helperText:`The QBO company ID to connect to.`,helperLink:`https://github.com/intuit/quickbooks-online-mcp-server#authentication`},{key:`QUICKBOOKS_ENVIRONMENT`,label:`Environment`,type:`text`,placeholder:`sandbox`,required:!1,helperText:`sandbox or production (default: sandbox).`}]},auth:{strategy:`none`}}]},{id:`sonarqube`,name:`SonarQube`,description:`Inspect code quality and security findings, quality gates, and analyze code snippets from SonarQube Server or Cloud.`,categories:[`Engineering`,`Security`],appUrl:`https://www.sonarsource.com/products/sonarqube/mcp-server/`,docsUrl:`https://github.com/SonarSource/sonarqube-mcp-server`,notes:`Uses SonarSource's official SonarQube MCP Server, run locally as a Docker container. Provide a SonarQube user token. Set SONARQUBE_ORG for SonarQube Cloud, or SONARQUBE_URL for a self-managed SonarQube Server (or https://sonarqube.us for SonarQube Cloud US).`,popularityRank:43,installHint:`SONARQUBE_TOKEN is always required. For SonarQube Cloud, set your organization key in SONARQUBE_ORG. For a self-managed SonarQube Server, set SONARQUBE_URL to your server URL; for SonarQube Cloud US, set SONARQUBE_URL to https://sonarqube.us. Requires a container runtime such as Docker.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`sonarqube`,command:`docker`,args:[`run`,`--init`,`--pull=always`,`-i`,`--rm`,`-e`,`SONARQUBE_TOKEN`,`-e`,`SONARQUBE_ORG`,`-e`,`SONARQUBE_URL`,`sonarsource/sonarqube-mcp`],envFields:[{key:`SONARQUBE_TOKEN`,label:`SonarQube token`,type:`password`,required:!0,helperText:`User token generated in your SonarQube Server or Cloud account settings.`,helperLink:`https://docs.sonarsource.com/sonarqube-cloud/managing-your-account/managing-tokens/`},{key:`SONARQUBE_ORG`,label:`Organization key (SonarQube Cloud)`,type:`text`,required:!1,placeholder:`my-org`,helperText:`Required for SonarQube Cloud. Your organization key, found in SonarQube Cloud.`},{key:`SONARQUBE_URL`,label:`Server URL (SonarQube Server)`,type:`text`,required:!1,placeholder:`https://sonarqube.example.com`,helperText:`Required for a self-managed SonarQube Server. For SonarQube Cloud US, use https://sonarqube.us.`}]},auth:{strategy:`api_key`}}],iconBg:`#126ED3`,logoUrl:`https://cdn.simpleicons.org/sonarqubeserver/FFFFFF`,keywords:[`code quality`,`static analysis`,`security`,`sast`,`quality gate`,`sonarcloud`]},{id:`okta`,name:`Okta`,description:`Identity, users, applications, and access administration.`,categories:[`Identity`,`Enterprise`],appUrl:`https://www.okta.com`,docsUrl:`https://developer.okta.com/docs/guides/implement-oauth-for-okta/main/`,notes:`High-value admin and security automation surface.`,popularityRank:42,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://{yourOktaDomain}/oauth2/v1/authorize`,tokenUrl:`https://{yourOktaDomain}/oauth2/v1/token`,scopes:[`okta.users.read`]}},http:{apiBaseUrl:`https://{yourOktaDomain}/api/v1`,openApiUrl:`https://raw.githubusercontent.com/okta/okta-sdk-java/master/src/swagger/api.yaml`}}]},{id:`netlify`,name:`Netlify`,description:`Sites, builds, deploy previews, and web operations.`,categories:[`Deployment`,`Developer tools`],appUrl:`https://www.netlify.com`,docsUrl:`https://docs.netlify.com/api/get-started/#oauth-applications`,notes:`Common alternative hosting/deployment automation target.`,popularityRank:40,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.netlify.com/authorize`,tokenUrl:`https://api.netlify.com/oauth/token`,scopes:[`sites:read`]}},http:{apiBaseUrl:`https://api.netlify.com/api/v1`,openApiUrl:`https://raw.githubusercontent.com/netlify/open-api/master/swagger.yml`}}]},{id:`vercel`,name:`Vercel`,description:`Deployments, projects, domains, and preview environment workflows.`,categories:[`Developer tools`,`Deployment`],appUrl:`https://vercel.com`,docsUrl:`https://vercel.com/docs/rest-api#oauth-apps`,notes:`Especially relevant to this repo's deployment model.`,popularityRank:39,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://vercel.com/oauth/authorize`,tokenUrl:`https://api.vercel.com/v2/oauth/access_token`,scopes:[`project:read`]}},http:{apiBaseUrl:`https://api.vercel.com`,openApiUrl:`https://api.apis.guru/v2/specs/vercel.com/0.0.1/openapi.json`}}]},{id:`supabase`,name:`Supabase`,description:`Query and manage your Supabase project, including database, auth, and storage.`,categories:[`Database`,`Developer tools`],appUrl:`https://supabase.com`,docsUrl:`https://supabase.com/docs/guides/getting-started/mcp`,notes:`Popular developer platform with broad automation value and a documented management-API OAuth integration flow.`,popularityRank:38,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`supabase`,command:`npx`,args:[`-y`,`@supabase/mcp-server-supabase@latest`],envFields:[{key:`SUPABASE_ACCESS_TOKEN`,label:`Supabase access token`,type:`password`,required:!0,helperText:`Personal access token from your Supabase dashboard.`,helperLink:`https://supabase.com/dashboard/account/tokens`}]},auth:{strategy:`api_key`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://api.supabase.com/v1/oauth/authorize`,tokenUrl:`https://api.supabase.com/v1/oauth/token`,scopes:[]}},http:{apiBaseUrl:`https://api.supabase.com/v1`,openApiUrl:`https://raw.githubusercontent.com/supabase/supabase/master/apps/docs/spec/api_v1_openapi.json`}}],iconBg:`#3ECF8E`,logoUrl:`https://cdn.simpleicons.org/supabase/FFFFFF`,keywords:[`database`,`auth`,`storage`,`postgres`]},{id:`posthog`,name:`PostHog`,description:`Product analytics, feature flags, and session insights.`,categories:[`Analytics`,`Product`],appUrl:`https://posthog.com`,docsUrl:`https://posthog.com/docs/model-context-protocol`,notes:`Uses PostHog's official hosted MCP server. OAuth is preferred; the bearer-token option remains for clients or deployments that require a personal API key. The OAuth URL defaults to read-only mode; remove readonly=true only when write access has been approved.`,popularityRank:37,iconBg:`#1D4AFF`,logoUrl:`https://cdn.simpleicons.org/posthog/FFFFFF`,keywords:[`analytics`,`feature flags`,`product`,`experiments`],installHint:`Prefer OAuth. The default OAuth connection uses read-only MCP mode; edit the URL or use the bearer-key fallback only when a workflow needs approved write access. For API keys, create a PostHog personal API key with the MCP Server preset.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://oauth.posthog.com/oauth/authorize/`,tokenUrl:`https://oauth.posthog.com/oauth/token/`,registrationUrl:`https://oauth.posthog.com/oauth/register/`,scopes:[`openid`,`profile`,`email`,`organization:read`,`project:read`,`dashboard:read`,`insight:read`,`query:read`,`event_definition:read`],pkce:!0,clientAuthentication:`none`,additionalAuthorizationParams:{resource:`https://mcp.posthog.com/mcp`},additionalTokenParams:{resource:`https://mcp.posthog.com/mcp`}}},transport:{kind:`shttp`,url:`https://mcp.posthog.com/mcp?readonly=true`,urlEditable:!0}},{id:`api-key`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.posthog.com/mcp`},auth:{strategy:`bearer`,credentialLabel:`PostHog personal API key`,credentialPlaceholder:`Paste your PostHog personal API key`,credentialHelp:`Create one under PostHog > User settings > API keys using the MCP Server preset. Sent as Authorization: Bearer <token>.`,credentialSecretName:`POSTHOG_PERSONAL_API_KEY`,saveCredentialAsSecretByDefault:!0}}]},{id:`sentry`,name:`Sentry`,description:`Triage issues, inspect events, and run Seer fixes against your Sentry org.`,categories:[`Observability`,`Engineering`],appUrl:`https://sentry.io`,docsUrl:`https://docs.sentry.io/product/sentry-mcp/`,notes:`Natural target for engineering support agents.`,popularityRank:36,connectionOptions:[{id:`oauth-mcp`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.sentry.dev/mcp`},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://sentry.io/oauth/authorize`,tokenUrl:`https://sentry.io/oauth/token`,scopes:[`project:read`,`event:read`,`org:read`]}}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://sentry.io/oauth/authorize`,tokenUrl:`https://sentry.io/oauth/token`,scopes:[`project:read`,`event:read`,`org:read`]}},http:{apiBaseUrl:`https://sentry.io/api/0`,openApiUrl:`https://raw.githubusercontent.com/getsentry/sentry/master/api-docs/openapi.json`}}],iconBg:`#362D59`,logoUrl:`https://cdn.simpleicons.org/sentry/FFFFFF`,keywords:[`errors`,`observability`,`monitoring`,`crash`]},{id:`datadog`,name:`Datadog`,description:`Logs, metrics, monitors, incidents, and observability workflows.`,categories:[`Observability`,`Operations`],appUrl:`https://www.datadoghq.com`,docsUrl:`https://docs.datadoghq.com/mcp_server/setup/`,notes:`Uses Datadog's official hosted MCP server. The MCP endpoint host is site-specific: use https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (e.g. mcp.us5.datadoghq.com for US5). The default URL below targets US1 and can be edited in the install dialog.`,popularityRank:35,installHint:`The Datadog MCP URL is site-specific. Edit the URL to https://mcp.<site>.datadoghq.com/v1/mcp for your Datadog site (for example https://mcp.us5.datadoghq.com/v1/mcp for US5, https://mcp.eu.datadoghq.com/v1/mcp for EU). Find your site at Organization Settings → Site in Datadog.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.datadoghq.com/oauth2/v1/authorize`,tokenUrl:`https://api.datadoghq.com/oauth2/v1/token`,scopes:[`dashboards_read`,`monitors_read`]}},transport:{kind:`shttp`,url:`https://mcp.datadoghq.com/v1/mcp`}},{id:`api`,provider:`mcp`,auth:{strategy:`none`},transport:{kind:`shttp`,url:`https://mcp.datadoghq.com/v1/mcp`,urlEditable:!0,headerFields:[{key:`DD-API-KEY`,label:`Datadog API key`,type:`password`,required:!0,placeholder:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,helperText:`Created in Datadog under Organization Settings → API Keys. Used to authenticate to the Datadog MCP server. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication).`},{key:`DD-APPLICATION-KEY`,label:`Datadog Application key`,type:`password`,required:!0,placeholder:`xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx`,helperText:`Created in Datadog under Organization Settings → Application Keys. Grants the MCP server access to your Datadog data. See the [setup docs](https://docs.datadoghq.com/mcp_server/setup/?tab=other#authentication).`}]}}]},{id:`canva`,name:`Canva`,description:`Design content, brand assets, and marketing collateral workflows.`,categories:[`Design`,`Marketing`],appUrl:`https://www.canva.com`,docsUrl:`https://www.canva.dev/docs/connect/oauth/`,notes:`Broad creator and marketing adoption with OAuth-based apps.`,popularityRank:34,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{tokenUrl:`https://api.canva.com/rest/v1/oauth/token`,scopes:[],authorizationUrl:`https://www.canva.com/api/oauth/authorize`}},http:{apiBaseUrl:`https://api.canva.com/rest/v1`,openApiUrl:`https://raw.githubusercontent.com/canva-sdks/canva-connect-api-starter-kit/main/openapi/spec.yml`}}]},{id:`miro`,name:`Miro`,description:`Whiteboards, diagrams, notes, and workshop collaboration.`,categories:[`Whiteboard`,`Collaboration`],appUrl:`https://miro.com`,docsUrl:`https://developers.miro.com/docs/mcp-intro`,notes:`Strong visual collaboration target for design and product teams.`,popularityRank:33,iconBg:`#FFD02F`,logoUrl:`https://cdn.simpleicons.org/miro/05003B`,keywords:[`whiteboard`,`collaboration`,`diagrams`,`visual`],installHint:`Connect Miro's hosted MCP server with OAuth.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://miro.com/oauth/authorize`,tokenUrl:`https://api.miro.com/v1/oauth/token`,scopes:[`boards:read`]}},transport:{kind:`shttp`,url:`https://mcp.miro.com/`}}]},{id:`webflow`,name:`Webflow`,description:`CMS items, sites, and web publishing workflows.`,categories:[`CMS`,`Marketing`],appUrl:`https://webflow.com`,docsUrl:`https://developers.webflow.com/mcp/reference/getting-started`,notes:`Uses Webflow's official hosted MCP server and deployment-scoped MCP OAuth registration so each user can authorize their own sites and workspaces.`,popularityRank:32,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://mcp.webflow.com/oauth/authorize`,tokenUrl:`https://mcp.webflow.com/oauth/token`,scopes:[],pkce:!0,clientAuthentication:`none`,registrationUrl:`https://mcp.webflow.com/oauth/register`}},transport:{kind:`shttp`,url:`https://mcp.webflow.com/mcp`}}]},{id:`zoom`,name:`Zoom`,description:`Meetings, recordings, webinars, and scheduling operations.`,categories:[`Meetings`,`Calendar`],appUrl:`https://zoom.us`,docsUrl:`https://developers.zoom.us/docs/integrations/oauth/`,notes:`Frequently requested for scheduling and meeting summaries.`,popularityRank:31,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://zoom.us/oauth/authorize`,tokenUrl:`https://zoom.us/oauth/token`,scopes:[`meeting:read:user`]}},http:{apiBaseUrl:`https://api.zoom.us/v2`,openApiUrl:`https://api.apis.guru/v2/specs/zoom.us/2.0.0/openapi.json`}}]},{id:`discord`,name:`Discord`,description:`Guilds, channels, messages, and community operations.`,categories:[`Communication`,`Community`],appUrl:`https://discord.com`,docsUrl:`https://discord.com/developers/docs/topics/oauth2`,notes:`Useful for community automation and bot-assisted workflows.`,popularityRank:30,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://discord.com/oauth2/authorize`,tokenUrl:`https://discord.com/api/oauth2/token`,scopes:[`identify`,`guilds`]}},http:{apiBaseUrl:`https://discord.com/api/v10`,openApiUrl:`https://raw.githubusercontent.com/discord/discord-api-spec/main/specs/openapi.json`}}]},{id:`stripe`,name:`Stripe`,description:`Query customers, payments, subscriptions, and invoices via Stripe's hosted MCP server.`,categories:[`Payments`,`Finance`],appUrl:`https://stripe.com`,docsUrl:`https://stripe.com/docs/mcp`,notes:`High-value fintech automation target with mature OAuth patterns.`,popularityRank:28,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.stripe.com/`},auth:{strategy:`bearer`,credentialLabel:`Stripe restricted key`,credentialPlaceholder:`rk_live_...`,credentialHelp:`Create a Stripe restricted key for MCP access and paste it here.`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://connect.stripe.com/oauth/authorize`,tokenUrl:`https://connect.stripe.com/oauth/token`,scopes:[`read_only`]}},http:{apiBaseUrl:`https://api.stripe.com/v1`,openApiUrl:`https://raw.githubusercontent.com/stripe/openapi/master/openapi/spec3.json`}}],iconBg:`#635BFF`,logoUrl:`https://cdn.simpleicons.org/stripe/FFFFFF`,keywords:[`payments`,`billing`,`subscriptions`,`finance`]},{id:`intercom`,name:`Intercom`,description:`Customer support, conversations, inboxes, and CRM context.`,categories:[`Support`,`CRM`],appUrl:`https://www.intercom.com`,docsUrl:`https://developers.intercom.com/building-apps/docs/authentication-types`,notes:`Useful for customer-facing assistant workflows.`,popularityRank:27,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.intercom.com/oauth`,tokenUrl:`https://api.intercom.io/auth/eagle/token`,scopes:[`read_users`,`read_conversations`]}},http:{apiBaseUrl:`https://api.intercom.io`,openApiUrl:`https://raw.githubusercontent.com/intercom/Intercom-OpenAPI/main/descriptions/2.15/api.intercom.io.yaml`}}]},{id:`hubspot`,name:`HubSpot`,description:`CRM, marketing, tickets, and customer lifecycle workflows.`,categories:[`CRM`,`Marketing`],appUrl:`https://www.hubspot.com`,docsUrl:`https://developers.hubspot.com/docs/apps/developer-platform/build-apps/integrate-with-the-remote-hubspot-mcp-server`,notes:`Uses HubSpot's official remote MCP server plus MCP auth apps with PKCE.`,popularityRank:25,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,credentialHelp:`Use the client ID and secret from a HubSpot MCP auth app (Development → MCP Auth Apps). Standard HubSpot OAuth apps and private apps will not authenticate with mcp.hubspot.com.`,oauth:{authorizationUrl:`https://mcp.hubspot.com/oauth/authorize/user`,tokenUrl:`https://mcp.hubspot.com/oauth/v3/token`,scopes:[],pkce:!0,clientAuthentication:`body`}},transport:{kind:`shttp`,url:`https://mcp.hubspot.com`}}]},{id:`salesforce`,name:`Salesforce`,description:`CRM records, accounts, opportunities, and sales operations.`,categories:[`CRM`,`Sales`],appUrl:`https://www.salesforce.com`,docsUrl:`https://developer.salesforce.com/docs/platform/hosted-mcp-servers`,notes:`Very common enterprise CRM and agent-assist target.`,popularityRank:24,iconBg:`#00A1E0`,logoUrl:`https://cdn.jsdelivr.net/gh/OpenHands/extensions/integrations/icons/salesforce.svg`,keywords:[`crm`,`sales`,`records`,`enterprise`],installHint:`Activate an MCP server in Salesforce Setup (API Catalog → MCP Servers), create an External Client App, then connect. Edit the URL to match your server and org (e.g. /sandbox/ for sandboxes).`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.salesforce.com/services/oauth2/authorize`,tokenUrl:`https://login.salesforce.com/services/oauth2/token`,scopes:[`refresh_token`],pkce:!0}},transport:{kind:`shttp`,url:`https://api.salesforce.com/platform/mcp/v1/platform/sobject-reads`,urlEditable:!0}}]},{id:`sharepoint`,name:`SharePoint`,description:`Sites, document libraries, lists, and intranet content.`,categories:[`Knowledge base`,`Enterprise`],appUrl:`https://www.microsoft.com/microsoft-365/sharepoint/collaboration`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Frequently requested for enterprise knowledge retrieval.`,popularityRank:23,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Sites.Read.All`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`onedrive`,name:`OneDrive`,description:`Cloud file access and document workflows through Microsoft Graph.`,categories:[`Storage`,`Documents`],appUrl:`https://www.microsoft.com/microsoft-365/onedrive/online-cloud-storage`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Useful for enterprise file automation and search.`,popularityRank:22,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Files.Read`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`microsoft-teams`,name:`Microsoft Teams`,description:`Chats, channels, meetings, and collaboration via Microsoft Graph.`,categories:[`Communication`,`Enterprise`],appUrl:`https://www.microsoft.com/microsoft-teams/group-chat-software`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`Common enterprise chat target alongside Outlook.`,popularityRank:21,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Team.ReadBasic.All`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`microsoft-outlook`,name:`Microsoft Outlook`,description:`Mail, calendar, contacts, and meeting workflows through Microsoft Graph.`,categories:[`Email`,`Calendar`],appUrl:`https://www.microsoft.com/microsoft-365/outlook/email-and-calendar-software-microsoft-outlook`,docsUrl:`https://learn.microsoft.com/graph/auth-v2-user`,notes:`High-value Microsoft Graph integration surface for enterprise users.`,popularityRank:20,connectionOptions:[{id:`oauth`,provider:`http`,connectionModel:{principalType:`user`,credentialScope:`tenant`,resourceType:`tenant`,resourceCardinality:`one`,selectionMode:`automatic`,identityMapping:{source:`access_token_claims`,externalPrincipalIdPath:`oid`,externalTenantIdPath:`tid`,externalResourceIdPath:`tid`}},auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,scopes:[`Mail.Read`]}},http:{apiBaseUrl:`https://graph.microsoft.com/v1.0`,openApiUrl:`https://raw.githubusercontent.com/microsoftgraph/msgraph-metadata/master/openapi/v1.0/openapi.yaml`}}]},{id:`box`,name:`Box`,description:`Enterprise file storage, metadata, and collaboration.`,categories:[`Storage`,`Enterprise`],appUrl:`https://www.box.com`,docsUrl:`https://developer.box.com/guides/authentication/oauth2/`,notes:`Strong enterprise document-management footprint.`,popularityRank:19,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://account.box.com/api/oauth2/authorize`,tokenUrl:`https://api.box.com/oauth2/token`,scopes:[`root_readonly`,`item_read`]}},http:{apiBaseUrl:`https://api.box.com/2.0`,openApiUrl:`https://raw.githubusercontent.com/box/box-openapi/main/openapi.json`}}]},{id:`airtable`,name:`Airtable`,description:`List bases, query records, and update fields across your Airtable workspace.`,categories:[`Database`,`Operations`],appUrl:`https://airtable.com`,docsUrl:`https://github.com/domdomegg/airtable-mcp-server`,notes:`Very common internal-tools and operations automation surface.`,popularityRank:17,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`airtable`,command:`npx`,args:[`-y`,`airtable-mcp-server`],envFields:[{key:`AIRTABLE_API_KEY`,label:`Airtable personal access token`,type:`password`,required:!0,helperText:`Personal access token from your Airtable account.`,helperLink:`https://airtable.com/create/tokens`}]},auth:{strategy:`api_key`}}],iconBg:`#FCB400`,logoUrl:`https://cdn.simpleicons.org/airtable/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`spreadsheet`,`database`,`records`,`bases`]},{id:`monday`,name:`Monday.com`,description:`Boards, automations, and work management across teams.`,categories:[`Project management`,`Operations`],appUrl:`https://monday.com`,docsUrl:`https://monday.com/w/mcp`,notes:`High-demand operations platform with rich board APIs.`,popularityRank:16,iconBg:`#FF3D00`,keywords:[`project management`,`boards`,`work`,`operations`],installHint:`Connect monday.com's hosted MCP server with OAuth.`,connectionOptions:[{id:`oauth`,provider:`mcp`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.monday.com/oauth2/authorize`,tokenUrl:`https://auth.monday.com/oauth2/token`,scopes:[`boards:read`]}},transport:{kind:`shttp`,url:`https://mcp.monday.com/mcp`}}]},{id:`trello`,name:`Trello`,description:`Boards, cards, checklists, and lightweight project planning.`,categories:[`Project management`,`Operations`],appUrl:`https://trello.com`,docsUrl:`https://developer.atlassian.com/cloud/trello/guides/rest-api/authorization/`,notes:`Trello now uses Atlassian OAuth2 (auth.atlassian.com) for API authorization.`,popularityRank:14,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://api.atlassian.com/oauth/token`,scopes:[`read`,`write`]}},http:{apiBaseUrl:`https://api.trello.com/1`,openApiUrl:`https://developer.atlassian.com/cloud/trello/swagger.v3.json`}}]},{id:`asana`,name:`Asana`,description:`Task management, projects, and work tracking.`,categories:[`Project management`,`Operations`],appUrl:`https://asana.com`,docsUrl:`https://developers.asana.com/docs/oauth`,notes:`Broad business adoption and straightforward OAuth app model.`,popularityRank:13,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://app.asana.com/-/oauth_authorize`,tokenUrl:`https://app.asana.com/-/oauth_token`,scopes:[`tasks:read`]}},http:{apiBaseUrl:`https://app.asana.com/api/1.0`,openApiUrl:`https://api.apis.guru/v2/specs/asana.com/1.0/openapi.json`}}]},{id:`confluence`,name:`Confluence`,description:`Wiki pages, spaces, and internal documentation search.`,categories:[`Documentation`,`Knowledge base`],appUrl:`https://www.atlassian.com/software/confluence`,docsUrl:`https://developer.atlassian.com/cloud/confluence/oauth-2-3lo-apps/`,notes:`Natural companion to Jira for software teams.`,popularityRank:11,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,scopes:[`read:page:confluence`]}},http:{apiBaseUrl:`https://api.atlassian.com/ex/confluence/{cloudId}`,openApiUrl:`https://developer.atlassian.com/cloud/confluence/swagger.v3.json`}}]},{id:`jira`,name:`Jira`,description:`Issue tracking, sprint workflows, and engineering program management.`,categories:[`Project management`,`Engineering`],appUrl:`https://www.atlassian.com/software/jira`,docsUrl:`https://developer.atlassian.com/cloud/jira/platform/oauth-2-3lo-apps/`,notes:`Very common MCP target for software teams and ticket automation.`,popularityRank:10,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,scopes:[`read:jira-work`]}},http:{apiBaseUrl:`https://api.atlassian.com/ex/jira/{cloudId}`,openApiUrl:`https://developer.atlassian.com/cloud/jira/platform/swagger.v3.json`}}]},{id:`google-calendar`,name:`Google Calendar`,description:`Calendar search, event scheduling, and meeting coordination.`,categories:[`Calendar`,`Scheduling`],appUrl:`https://workspace.google.com/products/calendar/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Strong personal productivity use case with mature OAuth flows.`,popularityRank:9,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/calendar.readonly`]}},http:{apiBaseUrl:`https://www.googleapis.com/calendar/v3`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/calendar/v3/openapi.json`}}]},{id:`gmail`,name:`Gmail`,description:`Mailbox search, drafting, sending, and thread triage.`,categories:[`Communication`,`Email`],appUrl:`https://workspace.google.com/products/gmail/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Popular agent workflow target for inbox triage and drafting.`,popularityRank:8,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/gmail.readonly`]}},http:{apiBaseUrl:`https://gmail.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/gmail/v1/openapi.json`}}]},{id:`google-sheets`,name:`Google Sheets`,description:`Spreadsheet reads, writes, formulas, and reporting workflows.`,categories:[`Spreadsheets`,`Analytics`],appUrl:`https://workspace.google.com/products/sheets/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`High-value automation surface for agent-driven reporting and structured edits.`,popularityRank:7,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/spreadsheets.readonly`]}},http:{apiBaseUrl:`https://sheets.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/sheets/v4/openapi.json`}}]},{id:`google-drive`,name:`Google Drive`,description:`File search, metadata, folders, and document discovery.`,categories:[`Storage`,`Documents`],appUrl:`https://workspace.google.com/products/drive/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Natural expansion of the Google Workspace surface beyond Google Docs.`,popularityRank:6,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/drive.metadata.readonly`]}},http:{apiBaseUrl:`https://www.googleapis.com/drive/v3`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/drive/v3/openapi.json`}}]},{id:`figma`,name:`Figma`,description:`Read Figma frames, components, and styles to ground UI work in your designs.`,categories:[`Design`,`Frontend`],appUrl:`https://www.figma.com`,docsUrl:`https://github.com/GLips/Figma-Context-MCP`,popularityRank:5,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`figma`,command:`npx`,args:[`-y`,`figma-developer-mcp`,`--stdio`],envFields:[{key:`FIGMA_API_KEY`,label:`Figma personal access token`,type:`password`,required:!0,helperText:`Personal access token from your Figma account settings.`,helperLink:`https://developers.figma.com/docs/rest-api/authentication/#personal-access-tokens`}]},auth:{strategy:`api_key`}},{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,scopes:[`current_user:read`,`file_content:read`,`file_metadata:read`,`projects:read`]}},http:{apiBaseUrl:`https://api.figma.com`,openApiUrl:`https://raw.githubusercontent.com/figma/rest-api-spec/main/openapi/openapi.yaml`}}],iconBg:`var(--oh-surface)`,logoUrl:`https://cdn.simpleicons.org/figma/FFFFFF`,keywords:[`design`,`ui`,`frames`,`components`]},{id:`google-docs`,name:`Google Docs`,description:`Docs authoring and Google Workspace document automation.`,categories:[`Documents`,`Knowledge base`],appUrl:`https://workspace.google.com/products/docs/`,docsUrl:`https://developers.google.com/identity/protocols/oauth2`,notes:`Current managed connector accepts a Google access token manually; a full OAuth connect flow can remove token copy/paste.`,popularityRank:2,connectionOptions:[{id:`oauth`,provider:`http`,auth:{strategy:`oauth2`,oauth:{authorizationUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,scopes:[`https://www.googleapis.com/auth/documents.readonly`]}},http:{apiBaseUrl:`https://docs.googleapis.com`,openApiUrl:`https://api.apis.guru/v2/specs/googleapis.com/docs/v1/openapi.json`}}]},{id:`apify`,name:`Apify Actors`,description:`Run any of Apify's 5,000+ Actors (scrapers, automations) from the agent.`,docsUrl:`https://docs.apify.com/platform/integrations/mcp`,iconBg:`#10b981`,keywords:[`scraping`,`automation`,`crawl`,`actors`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`apify`,command:`npx`,args:[`-y`,`@apify/actors-mcp-server`],envFields:[{key:`APIFY_TOKEN`,label:`Apify token`,type:`password`,required:!0,helperText:`API token from your Apify account settings.`,helperLink:`https://console.apify.com/account/integrations`}]},auth:{strategy:`api_key`}}]},{id:`atlassian-rovo`,name:`Atlassian Rovo`,description:`Search, create, and update Jira issues, Confluence pages, Bitbucket repos, and Jira Service Management tickets - all through Atlassian's official hosted MCP server, powered by your Teamwork Graph.`,categories:[`Project management`,`Documentation`,`Engineering`],appUrl:`https://www.atlassian.com/rovo`,docsUrl:`https://support.atlassian.com/atlassian-rovo-mcp-server/docs/getting-started-with-the-atlassian-remote-mcp-server/`,notes:`OAuth 2.1 is handled entirely by the Atlassian Rovo MCP server. No client credentials required - sign in with your Atlassian account when the authentication flow starts.`,iconBg:`#0052CC`,logoUrl:`https://cdn.simpleicons.org/atlassian/FFFFFF`,keywords:[`atlassian`,`rovo`,`jira`,`confluence`,`bitbucket`,`jsm`,`tickets`,`wiki`,`issues`,`sprint`,`mcp`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.atlassian.com/v1/mcp/authv2`},auth:{strategy:`oauth2`,oauth:{clientAuthentication:`none`}}}]},{id:`brave-search`,name:`Brave Search`,description:`Privacy-first web and local search using the Brave Search API.`,docsUrl:`https://github.com/brave/brave-search-mcp-server`,iconBg:`#FB542B`,logoUrl:`https://cdn.simpleicons.org/brave/FFFFFF`,keywords:[`search`,`web`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`brave_search`,command:`npx`,args:[`-y`,`@brave/brave-search-mcp-server`,`--transport`,`stdio`],envFields:[{key:`BRAVE_API_KEY`,label:`Brave API key`,type:`password`,required:!0,helperText:`API key from the Brave Search API portal.`,helperLink:`https://api-dashboard.search.brave.com/app/keys`}]},auth:{strategy:`api_key`}}]},{id:`browser-mcp`,name:`Browser MCP`,description:`Control your local browser tab — navigate, click, type, and read DOM contents.`,docsUrl:`https://browsermcp.io/`,iconBg:`#0EA5E9`,keywords:[`browser`,`automation`,`chrome`,`playwright`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`browser_mcp`,command:`npx`,args:[`-y`,`@browsermcp/mcp`]},auth:{strategy:`none`}}]},{id:`clickhouse`,name:`ClickHouse`,description:`Run analytical SQL queries against a ClickHouse cluster.`,docsUrl:`https://github.com/ClickHouse/mcp-clickhouse`,iconBg:`#FFFF00`,logoUrl:`https://cdn.simpleicons.org/clickhouse/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`analytics`,`olap`,`database`,`sql`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`clickhouse`,command:`uvx`,args:[`mcp-clickhouse`],envFields:[{key:`CLICKHOUSE_HOST`,label:`Host`,type:`text`,placeholder:`clickhouse.example.com`,required:!0},{key:`CLICKHOUSE_USER`,label:`Username`,type:`text`,required:!0},{key:`CLICKHOUSE_PASSWORD`,label:`Password`,type:`password`,required:!0,helperText:`Password for your ClickHouse user.`,helperLink:`https://clickhouse.com/docs/operations/access-rights`}]},auth:{strategy:`api_key`}}]},{id:`cloudflare-bindings`,name:`Cloudflare Workers Bindings`,description:`Inspect and manage KV, D1, R2, and Durable Object bindings on your Cloudflare account.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`workers`,`kv`,`d1`,`r2`,`durable objects`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://bindings.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-browser-rendering`,name:`Cloudflare Browser Rendering`,description:`Fetch and screenshot pages using Cloudflare's hosted browser rendering.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`browser`,`rendering`,`screenshots`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://browser.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-builds`,name:`Cloudflare Builds`,description:`Inspect Workers Builds — logs, statuses, and rerun failed deploys.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`workers`,`ci`,`builds`,`deploys`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://builds.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`cloudflare-docs`,name:`Cloudflare Docs`,description:`Search and reference Cloudflare's developer documentation directly from the agent.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`docs`,`reference`,`workers`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://docs.mcp.cloudflare.com/mcp`},auth:{strategy:`none`}}]},{id:`cloudflare-observability`,name:`Cloudflare Observability`,description:`Tail Workers logs and query observability data from your Cloudflare account.`,docsUrl:`https://developers.cloudflare.com/agents/model-context-protocol/`,iconBg:`#F38020`,logoUrl:`https://cdn.simpleicons.org/cloudflare/FFFFFF`,keywords:[`cloudflare`,`logs`,`tail`,`observability`,`workers`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://observability.mcp.cloudflare.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`deepwiki`,name:`DeepWiki`,description:`Ask grounded questions about any public GitHub repository via Devin's DeepWiki MCP.`,docsUrl:`https://docs.devin.ai/work-with-devin/deepwiki-mcp`,iconBg:`var(--oh-color-base)`,keywords:[`devin`,`code`,`wiki`,`github`,`docs`,`qa`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.deepwiki.com/mcp`},auth:{strategy:`none`}}]},{id:`everything`,name:`Everything (demo)`,description:`Reference server exercising every MCP capability — useful for testing.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/everything`,iconBg:`#6366F1`,keywords:[`demo`,`test`,`reference`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`everything`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-everything`]},auth:{strategy:`none`}}]},{id:`exa`,name:`Exa`,description:`Neural web search with semantic ranking, content extraction, and similar-page lookup.`,docsUrl:`https://docs.exa.ai/reference/exa-mcp`,iconBg:`var(--oh-surface)`,keywords:[`search`,`web`,`research`,`neural`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`exa`,command:`npx`,args:[`-y`,`exa-mcp-server`],envFields:[{key:`EXA_API_KEY`,label:`Exa API key`,type:`password`,required:!0,helperText:`API key from your Exa account.`,helperLink:`https://exa.ai/docs/reference/getting-started`}]},auth:{strategy:`api_key`}}]},{id:`fetch`,name:`Fetch`,description:`Plain HTTP fetcher: download a URL and convert HTML to readable markdown.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/fetch`,iconBg:`var(--oh-interactive-hover)`,keywords:[`http`,`web`,`url`,`scrape`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`fetch`,command:`uvx`,args:[`mcp-server-fetch`]},auth:{strategy:`none`}}]},{id:`filesystem`,name:`Filesystem`,description:`Give the agent secure, scoped filesystem access outside the workspace.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem`,iconBg:`var(--oh-interactive-hover)`,keywords:[`files`,`local`,`disk`],installHint:`Each path is exposed read/write. Add as many as you need, separated by spaces.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`filesystem`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-filesystem`],argFields:[{key:`paths`,label:`Paths (space separated)`,type:`text`,placeholder:`/Users/me/Documents /Users/me/Projects`,required:!0,helperText:`Each whitespace-separated token is appended as its own argument.`}]},auth:{strategy:`api_key`}}]},{id:`firecrawl`,name:`Firecrawl`,description:`Crawl any site and return clean markdown, structured data, or screenshots.`,docsUrl:`https://docs.firecrawl.dev/mcp`,iconBg:`#F97316`,keywords:[`scraping`,`crawl`,`web`,`markdown`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`firecrawl`,command:`npx`,args:[`-y`,`firecrawl-mcp`],envFields:[{key:`FIRECRAWL_API_KEY`,label:`Firecrawl API key`,type:`password`,required:!0,helperText:`API key from your Firecrawl dashboard.`,helperLink:`https://www.firecrawl.dev/app/api-keys`}]},auth:{strategy:`api_key`}}]},{id:`git`,name:`Git`,description:`Local git repository operations: log, diff, blame, status, and more.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/git`,iconBg:`#F1502F`,keywords:[`version control`,`log`,`diff`,`blame`],installHint:`Runs the official Python server via uvx — no setup beyond the path.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`git`,command:`uvx`,args:[`mcp-server-git`,`--repository`],argFields:[{key:`repo_path`,label:`Repository path`,type:`text`,placeholder:`/Users/me/code/my-repo`,required:!0,helperText:`Appended as --repository <path>.`}]},auth:{strategy:`api_key`}}]},{id:`huggingface`,name:`Hugging Face`,description:`Search models, datasets, and Spaces on the Hugging Face Hub from your agent.`,docsUrl:`https://huggingface.co/docs/huggingface_hub/en/guides/mcp`,iconBg:`#FFD21E`,logoUrl:`https://cdn.simpleicons.org/huggingface/000000`,iconColor:`#000000`,keywords:[`ml`,`models`,`datasets`,`ai`,`hub`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`shttp`,url:`https://huggingface.co/mcp`,apiKeyOptional:!0},auth:{strategy:`none`,apiKeyOptional:!0}}]},{id:`kagi`,name:`Kagi Search`,description:`Paid, privacy-first search with high signal-to-noise — great for research.`,docsUrl:`https://github.com/kagisearch/kagimcp`,iconBg:`#FFB319`,logoUrl:`https://cdn.simpleicons.org/kagi/000000`,iconColor:`var(--oh-surface-deep)`,keywords:[`search`,`web`,`privacy`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`kagi`,command:`uvx`,args:[`kagimcp`],envFields:[{key:`KAGI_API_KEY`,label:`Kagi API key`,type:`password`,required:!0,helperText:`API key from your Kagi account settings.`,helperLink:`https://kagi.com/settings?p=api`}]},auth:{strategy:`api_key`}}]},{id:`memory`,name:`Memory`,description:`Persistent key-value memory for the agent across conversations.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/memory`,iconBg:`#7C3AED`,keywords:[`memory`,`kv`,`state`,`persistence`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`memory`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-memory`]},auth:{strategy:`none`}}]},{id:`mongodb`,name:`MongoDB`,description:`Query MongoDB collections, inspect schemas, and run aggregation pipelines.`,docsUrl:`https://www.mongodb.com/docs/mcp-server/`,iconBg:`#00684A`,logoUrl:`https://cdn.simpleicons.org/mongodb/FFFFFF`,keywords:[`database`,`nosql`,`atlas`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`mongodb`,command:`npx`,args:[`-y`,`mongodb-mcp-server`],envFields:[{key:`MDB_MCP_CONNECTION_STRING`,label:`MongoDB connection string`,type:`password`,placeholder:`mongodb+srv://user:pass@cluster.mongodb.net`,required:!0,helperText:`Connection string from your MongoDB Atlas cluster.`,helperLink:`https://www.mongodb.com/docs/atlas/connect-to-database-deployment/#connect-with-a-connection-string`}]},auth:{strategy:`api_key`}}]},{id:`neon`,name:`Neon`,description:`Serverless Postgres: list projects, run queries, manage branches.`,docsUrl:`https://neon.com/docs/ai/neon-mcp-server`,iconBg:`#00E599`,iconColor:`var(--oh-surface-deep)`,keywords:[`database`,`postgres`,`serverless`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`neon`,command:`npx`,args:[`-y`,`@neondatabase/mcp-server-neon`,`start`],envFields:[{key:`NEON_API_KEY`,label:`Neon API key`,type:`password`,required:!0,helperText:`API key from your Neon account settings.`,helperLink:`https://neon.tech/docs/manage/api-keys`}]},auth:{strategy:`api_key`}}]},{id:`obsidian`,name:`Obsidian`,description:`Read and edit Markdown notes inside an Obsidian vault on the local disk.`,docsUrl:`https://github.com/MarkusPfundstein/mcp-obsidian`,iconBg:`#7C3AED`,logoUrl:`https://cdn.simpleicons.org/obsidian/FFFFFF`,keywords:[`notes`,`knowledge`,`markdown`,`vault`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`obsidian`,command:`uvx`,args:[`mcp-obsidian`],envFields:[{key:`OBSIDIAN_API_KEY`,label:`Local REST API key`,type:`password`,required:!0,helperText:`From the Obsidian 'Local REST API' community plugin.`,helperLink:`https://github.com/coddingtonbear/obsidian-local-rest-api`}]},auth:{strategy:`api_key`}}]},{id:`paypal`,name:`PayPal`,description:`Manage transactions and merchant data via PayPal's MCP server.`,docsUrl:`https://developer.paypal.com/tools/mcp-server/`,iconBg:`#003087`,logoUrl:`https://cdn.simpleicons.org/paypal/FFFFFF`,keywords:[`payments`,`billing`,`finance`],connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.paypal.com/mcp`},auth:{strategy:`oauth2`}}]},{id:`playwright`,name:`Playwright`,description:`Headless-browser automation backed by Microsoft Playwright.`,docsUrl:`https://github.com/microsoft/playwright-mcp`,iconBg:`#2EAD33`,keywords:[`browser`,`automation`,`e2e`,`testing`,`scrape`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`playwright`,command:`npx`,args:[`-y`,`@playwright/mcp`]},auth:{strategy:`none`}}]},{id:`redis`,name:`Redis`,description:`Get, set, scan, and inspect data on a Redis or Redis-compatible instance.`,docsUrl:`https://github.com/redis/mcp-redis`,iconBg:`#DC382D`,logoUrl:`https://cdn.simpleicons.org/redis/FFFFFF`,keywords:[`cache`,`kv`,`database`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`redis`,command:`uvx`,args:[`--from`,`redis-mcp-server@latest`,`redis-mcp-server`,`--url`],argFields:[{key:`redis_url`,label:`Redis URL`,type:`password`,placeholder:`redis://localhost:6379`,required:!0,helperText:`Connection URL for your Redis instance. Appended as --url <redis_url>.`,helperLink:`https://redis.io/docs/latest/operate/rc/databases/connect/`}]},auth:{strategy:`api_key`}}]},{id:`reportportal`,name:`ReportPortal`,description:`Query test launches, test items, history, and analysis from your ReportPortal test automation dashboard.`,categories:[`Engineering`,`Analytics`],appUrl:`https://reportportal.io`,docsUrl:`https://reportportal.io/docs/external-integrations/MCPServer/`,notes:`Uses ReportPortal's official MCP Server, run locally as a Docker container in the default stdio mode. ReportPortal is self-hosted, so there is no public MCP endpoint; the container connects to your own instance. Provide your ReportPortal host URL and an API token from your ReportPortal Profile page.`,installHint:`RP_HOST (the URL of your ReportPortal instance) and RP_API_TOKEN (from your ReportPortal Profile page) are required. RP_PROJECT (a default project name) is optional. Requires a container runtime such as Docker.`,connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`reportportal`,command:`docker`,args:[`run`,`--init`,`--pull=always`,`-i`,`--rm`,`-e`,`RP_API_TOKEN`,`-e`,`RP_HOST`,`-e`,`RP_PROJECT`,`reportportal/mcp-server`],envFields:[{key:`RP_API_TOKEN`,label:`ReportPortal API token`,type:`password`,required:!0,helperText:`API token generated on your ReportPortal Profile page.`,helperLink:`https://reportportal.io/docs/external-integrations/MCPServer/`},{key:`RP_HOST`,label:`ReportPortal host URL`,type:`text`,required:!0,placeholder:`https://your-reportportal-instance.com`,helperText:`The base URL of your ReportPortal instance.`},{key:`RP_PROJECT`,label:`Default project name`,type:`text`,required:!1,placeholder:`my-project`,helperText:`Optional default ReportPortal project name to use for requests.`}]},auth:{strategy:`api_key`}}],iconBg:`#00B4D5`,keywords:[`test reporting`,`test automation`,`qa`,`launches`,`test analytics`,`quality gate`]},{id:`resend`,name:`Resend`,description:`Send transactional and marketing emails via the Resend API.`,docsUrl:`https://resend.com/docs/mcp`,iconBg:`var(--oh-surface-deep)`,logoUrl:`https://cdn.simpleicons.org/resend/FFFFFF`,keywords:[`email`,`transactional`,`smtp`],connectionOptions:[{id:`api`,provider:`mcp`,transport:{kind:`stdio`,serverName:`resend`,command:`npx`,args:[`-y`,`mcp-send-email`],envFields:[{key:`RESEND_API_KEY`,label:`Resend API key`,type:`password`,required:!0,helperText:`API key from your Resend dashboard.`,helperLink:`https://resend.com/api-keys`},{key:`SENDER_EMAIL_ADDRESS`,label:`From address`,type:`text`,placeholder:`you@example.com`,required:!0}]},auth:{strategy:`api_key`}}]},{id:`sequential-thinking`,name:`Sequential Thinking`,description:`Lets the agent emit and revise a chain of structured thoughts.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/sequentialthinking`,iconBg:`var(--oh-color-base)`,keywords:[`reasoning`,`planning`,`thoughts`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`sequential_thinking`,command:`npx`,args:[`-y`,`@modelcontextprotocol/server-sequential-thinking`]},auth:{strategy:`none`}}]},{id:`superhuman-mail`,name:`Superhuman Mail`,description:`Search, read, draft, and send email via Superhuman's hosted MCP server.`,categories:[`Communication`,`Email`],appUrl:`https://superhuman.com`,docsUrl:`https://github.com/superhuman/mcp-mail`,notes:`OAuth is handled by the Superhuman MCP server itself (mcp-remote). No client credentials required.`,connectionOptions:[{id:`oauth`,provider:`mcp`,transport:{kind:`shttp`,url:`https://mcp.mail.superhuman.com/mcp`},auth:{strategy:`oauth2`,oauth:{clientAuthentication:`none`}}}],iconBg:`#FF5C28`,logoUrl:`https://cdn.simpleicons.org/superhuman/FFFFFF`,keywords:[`email`,`mail`,`superhuman`,`inbox`]},{id:`time`,name:`Time`,description:`Timezone-aware current time, conversions, and timestamp formatting.`,docsUrl:`https://github.com/modelcontextprotocol/servers/tree/main/src/time`,iconBg:`var(--oh-surface)`,keywords:[`clock`,`timezone`,`date`],connectionOptions:[{id:`none`,provider:`mcp`,transport:{kind:`stdio`,serverName:`time`,command:`uvx`,args:[`mcp-server-time`]},auth:{strategy:`none`}}]}],t=e=>JSON.parse(JSON.stringify(e)),n=e;new Map(n.map(e=>[e.id,e]));var r=t(n);export{r as t};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import{t as e}from"./rolldown-runtime-Cyuzqnbw.js";import{T as t,b as n,w as r,y as i}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-DvZtOcoT.js";var a=e(((e,t)=>{t.exports=function(){throw Error(`ws does not work in the browser. Browser clients must use the native WebSocket object`)}}));if(typeof window<`u`&&window.WebSocket)window.WebSocket;else try{a()}catch{}var o=class{constructor(e,t){this.cachedEvents=[],this.cachedEventIds=new Set,this.client=e instanceof r?e:new r(e),this.conversationId=t}async search(e={}){let t={limit:e.limit??100};return e.page_id&&(t.page_id=e.page_id),e.kind&&(t.kind=e.kind),e.source&&(t.source=e.source),e.body&&(t.body=e.body),e.sort_order&&(t.sort_order=e.sort_order),e.timestamp__gte&&(t.timestamp__gte=e.timestamp__gte),e.timestamp__lt&&(t.timestamp__lt=e.timestamp__lt),(await this.client.get(`/api/conversations/${this.conversationId}/events/search`,{params:t})).data}async count(e={}){let t={};return e.kind&&(t.kind=e.kind),e.source&&(t.source=e.source),e.body&&(t.body=e.body),e.timestamp__gte&&(t.timestamp__gte=e.timestamp__gte),e.timestamp__lt&&(t.timestamp__lt=e.timestamp__lt),(await this.client.get(`/api/conversations/${this.conversationId}/events/count`,{params:t})).data}async getEventById(e){return(await this.client.get(`/api/conversations/${this.conversationId}/events/${e}`)).data}async getEventsById(e){return Promise.all(e.map(async e=>{try{return await this.getEventById(e)}catch(e){if(e instanceof t&&e.status===404)return null;throw e}}))}async addEvent(e){this.cachedEventIds.has(e.id)||(this.cachedEvents.push(e),this.cachedEventIds.add(e.id))}async append(e){await this.addEvent(e)}createDefaultCallback(e){return t=>{this.addEvent(t).catch(t=>{e&&e(t instanceof Error?t:Error(`Error adding event to cache: ${t}`))})}}async length(){return this.cachedEvents.length}async getEvent(e){return this.cachedEvents[e]}async getEvents(e,t){let n=[],r;for(;;){let e={limit:100};r&&(e.page_id=r);let t=(await this.client.get(`/api/conversations/${this.conversationId}/events/search`,{params:e})).data;if(n.push(...t.items),!t.next_page_id)break;r=t.next_page_id}let i=new Set(n.map(e=>e.id)),a=[...n,...this.cachedEvents.filter(e=>!i.has(e.id))];return e===void 0&&t===void 0?a:a.slice(e,t)}async*[Symbol.asyncIterator](){let e=await this.getEvents();for(let t of e)yield t}},s=`__full_state__`,c=e=>typeof e==`object`&&!!e&&!Array.isArray(e),l=class e{constructor(e,t){this.cachedState=null,this.cachedAt=0,this.lock=new u,this.client=e,this.conversationId=t,this._events=new o(e,t)}async getConversationInfo(){return await this.lock.acquire(async()=>{if(this.cachedState!==null&&Date.now()-this.cachedAt<e.CACHE_TTL_MS)return this.normalizeFullState(this.cachedState);let t=await this.client.get(`/api/conversations/${this.conversationId}`),n=this.normalizeFullState(t.data);return this.cachedState=n,this.cachedAt=Date.now(),n})}normalizeFullState(e){return e.full_state??e}async refresh(){return this.cachedState=null,this.getConversationInfo()}async updateStateFromEvent(e){await this.lock.acquire(async()=>{if(e.key===s){this.cachedState===null&&(this.cachedState={});let t=c(e.value)&&c(e.value.full_state)?e.value.full_state:e.value;if(!c(t))throw Error(`Full conversation state update must contain an object value.`);Object.assign(this.cachedState,t)}else this.cachedState===null&&(this.cachedState={}),this.cachedState[e.key]=e.value;this.cachedAt=Date.now()})}createStateUpdateCallback(e){return t=>{t.kind===`ConversationStateUpdateEvent`&&this.updateStateFromEvent(t).catch(t=>{e&&e(t instanceof Error?t:Error(`Error updating state from event: ${t}`))})}}get events(){return this._events}get id(){return this.conversationId}async getExecutionStatus(){let e=await this.getConversationInfo(),t=e.execution_status??e.agent_status;if(t==null)throw Error(`execution_status missing in conversation info: ${JSON.stringify(e)}`);return t}async getAgentStatus(){return this.getExecutionStatus()}async setAgentStatus(e){throw Error(`Setting execution_status on RemoteState has no effect. Remote execution status is managed server-side. Attempted to set: ${e}`)}async getConfirmationPolicy(){let e=await this.getConversationInfo(),t=e.confirmation_policy;if(t==null)throw Error(`confirmation_policy missing in conversation info: ${JSON.stringify(e)}`);return t}async getActivatedKnowledgeSkills(){return(await this.getConversationInfo()).activated_knowledge_skills||[]}async getAgent(){let e=await this.getConversationInfo(),t=e.agent;if(t==null)throw Error(`agent missing in conversation info: ${JSON.stringify(e)}`);return t}async getWorkspace(){let e=await this.getConversationInfo(),t=e.workspace;if(t==null)throw Error(`workspace missing in conversation info: ${JSON.stringify(e)}`);return t}async getPersistenceDir(){let e=await this.getConversationInfo(),t=e.persistence_dir;if(t==null)throw Error(`persistence_dir missing in conversation info: ${JSON.stringify(e)}`);return t}async modelDump(){return await this.getConversationInfo()}async modelDumpJson(){let e=await this.modelDump();return JSON.stringify(e)}};l.CACHE_TTL_MS=2e3;var u=class{constructor(){this.locked=!1,this.queue=[]}async acquire(e){return new Promise((t,n)=>{let r=async()=>{try{t(await e())}catch(e){n(e)}finally{this.locked=!1;let e=this.queue.shift();e&&e()}};this.locked?this.queue.push(r):(this.locked=!0,r())})}},d=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.workingDir=e.workingDir,this.apiKey=e.apiKey,this.conversationId=e.conversationId;let{serverClient:t,runtimeClient:r}=n(e);this.serverClient=t,this.client=r,this.bash=new i({host:this.host,conversationId:this.conversationId,...this.apiKey?{apiKey:this.apiKey}:{}})}async startWorkspaceSession(e){if(this.conversationId!==void 0&&this.conversationId!==e)throw Error(`Workspace session must belong to the selected runtime`);return await this.serverClient.post(`/api/auth/workspace-session`,void 0,{credentials:`include`}),`${this.host}/api/conversations/${encodeURIComponent(e)}/workspace/`}async deleteWorkspaceSession(){await this.serverClient.delete(`/api/auth/workspace-session`,{credentials:`include`,acceptableStatusCodes:new Set([204])})}async executeCommand(e,t,n=30){let r={command:e,timeout:Math.floor(n)};t&&(r.cwd=t);let i=(await this.client.post(`/api/bash/execute_bash_command`,r,{timeout:(n+10)*1e3})).data;return{command:e,exit_code:i.exit_code??0,stdout:i.stdout||``,stderr:i.stderr||``,timeout_occurred:!1}}async fileUpload(e,t,n){let r=new FormData,i,a;e instanceof File?(i=e,a=n||e.name):e instanceof Blob?(i=e,a=n||`blob-file`):(i=new Blob([e],{type:`text/plain`}),a=n||`text-file.txt`),r.append(`file`,i,a);let o=(await this.client.request({method:`POST`,url:`/api/file/upload`,params:{path:t},data:r,timeout:6e4})).data;return{success:o.success??!0,source_path:a,destination_path:t,file_size:o.file_size,error:o.error}}async fileDownload(e){let t=await this.client.get(`/api/file/download`,{params:{path:e},timeout:6e4}),n,r;if(typeof t.data==`string`)n=t.data,r=new Blob([t.data]).size;else if(t.data instanceof ArrayBuffer)n=new Blob([t.data]),r=t.data.byteLength;else if(t.data instanceof Blob)n=t.data,r=t.data.size;else{let e=JSON.stringify(t.data);n=e,r=new Blob([e]).size}return{success:!0,source_path:e,content:n,file_size:r}}async gitChanges(e,t={}){let n={path:e};t.ref!==void 0&&(n.ref=t.ref);try{return(await this.client.get(`/api/git/changes`,{params:n})).data}catch(e){throw Error(`Failed to get git changes: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async gitDiff(e,t={}){let n={path:e};t.ref!==void 0&&(n.ref=t.ref);try{return(await this.client.get(`/api/git/diff`,{params:n})).data}catch(e){throw Error(`Failed to get git diff: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async uploadText(e,t,n){return this.fileUpload(e,t,n)}async uploadFileObject(e,t){return this.fileUpload(e,t)}async downloadAsText(e){let t=await this.fileDownload(e);if(!t.success)throw Error(t.error||`Download failed`);return typeof t.content==`string`?t.content:t.content instanceof Blob?await t.content.text():``}async downloadAsBlob(e){let t=await this.fileDownload(e);if(!t.success)throw Error(t.error||`Download failed`);return t.content instanceof Blob?t.content:typeof t.content==`string`?new Blob([t.content],{type:`text/plain`}):new Blob}async downloadAndSave(e,t){if(typeof document>`u`)throw Error(`downloadAndSave() is only available in browser environments. Use downloadAsBlob() or downloadAsText() in Node.js.`);let n=await this.downloadAsBlob(e),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t||e.split(`/`).pop()||`download`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}close(){this.bash.close(),this.client.close()}},f={execute_command:`Execute a bash command in the terminal within a persistent shell session.
|
|
2
|
+
|
|
3
|
+
### Command Execution
|
|
4
|
+
* One command at a time: You can only execute one bash command at a time. If you need to run multiple commands sequentially, use \`&&\` or \`;\` to chain them together.
|
|
5
|
+
* Persistent session: Commands execute in a persistent shell session where environment variables, virtual environments, and working directory persist between commands.
|
|
6
|
+
|
|
7
|
+
### Best Practices
|
|
8
|
+
* Directory verification: Before creating new directories or files, first verify the parent directory exists and is the correct location.
|
|
9
|
+
* Directory management: Try to maintain working directory by using absolute paths and avoiding excessive use of \`cd\`.
|
|
10
|
+
|
|
11
|
+
### Output Handling
|
|
12
|
+
* Output truncation: If the output exceeds a maximum length, it will be truncated before being returned.`,read_file:`Read the contents of a file from the workspace.
|
|
13
|
+
|
|
14
|
+
Custom editing tool for viewing, creating and editing files in plain-text format.
|
|
15
|
+
* If \`path\` is a text file, returns the file contents with line numbers
|
|
16
|
+
* If \`path\` is a directory, lists non-hidden files and directories up to 2 levels deep
|
|
17
|
+
|
|
18
|
+
Best practices:
|
|
19
|
+
* Use this tool to understand the file's contents and context before making edits
|
|
20
|
+
* Verify the directory path is correct when working with files`,write_file:`Write content to a file in the workspace. Creates the file if it does not exist.
|
|
21
|
+
|
|
22
|
+
When making edits:
|
|
23
|
+
* Ensure the edit results in idiomatic, correct code
|
|
24
|
+
* Do not leave the code in a broken state
|
|
25
|
+
* Always use absolute file paths (starting with /)
|
|
26
|
+
|
|
27
|
+
CRITICAL REQUIREMENTS:
|
|
28
|
+
* The content should be the complete file content, not a diff or patch
|
|
29
|
+
* Ensure proper formatting and indentation`,think:`Use the tool to think about something. It will not obtain new information or make any changes to the repository, but just log the thought. Use it when complex reasoning or brainstorming is needed.
|
|
30
|
+
|
|
31
|
+
Common use cases:
|
|
32
|
+
1. When exploring a repository and discovering the source of a bug, call this tool to brainstorm several unique ways of fixing the bug, and assess which change(s) are likely to be simplest and most effective.
|
|
33
|
+
2. After receiving test results, use this tool to brainstorm ways to fix failing tests.
|
|
34
|
+
3. When planning a complex refactoring, use this tool to outline different approaches and their tradeoffs.
|
|
35
|
+
4. When designing a new feature, use this tool to think through architecture decisions and implementation details.
|
|
36
|
+
5. When debugging a complex issue, use this tool to organize your thoughts and hypotheses.
|
|
37
|
+
|
|
38
|
+
The tool simply logs your thought process for better transparency and does not execute any code or make changes.`,finish:`Signals the completion of the current task or conversation.
|
|
39
|
+
|
|
40
|
+
Use this tool when:
|
|
41
|
+
- You have successfully completed the user's requested task
|
|
42
|
+
- You cannot proceed further due to technical limitations or missing information
|
|
43
|
+
|
|
44
|
+
The message should include:
|
|
45
|
+
- A clear summary of actions taken and their results
|
|
46
|
+
- Any next steps for the user
|
|
47
|
+
- Explanation if you're unable to complete the task
|
|
48
|
+
- Any follow-up questions if more information is needed`};f.execute_command,f.read_file,f.write_file,f.think,f.finish;var p;(function(e){e.PRE_TOOL_USE=`PreToolUse`,e.POST_TOOL_USE=`PostToolUse`,e.USER_PROMPT_SUBMIT=`UserPromptSubmit`,e.SESSION_START=`SessionStart`,e.SESSION_END=`SessionEnd`,e.STOP=`Stop`})(p||={});var m;(function(e){e.COMMAND=`command`,e.PROMPT=`prompt`})(m||={});var h;if((function(e){e.ALLOW=`allow`,e.DENY=`deny`})(h||={}),new Set(`|.*+?[]()^$\\`.split(``)),typeof window<`u`&&window.WebSocket)window.WebSocket;else try{a()}catch{}var g;(function(e){e.TIMESTAMP=`TIMESTAMP`,e.TIMESTAMP_DESC=`TIMESTAMP_DESC`})(g||={}),(function(e){e.REVERSE_TIMESTAMP=`TIMESTAMP_DESC`})(g||={});var _;(function(e){e.IDLE=`idle`,e.RUNNING=`running`,e.PAUSED=`paused`,e.WAITING_FOR_CONFIRMATION=`waiting_for_confirmation`,e.FINISHED=`finished`,e.ERROR=`error`,e.STUCK=`stuck`,e.DELETING=`deleting`})(_||={});var v;(function(e){e.CREATED_AT=`CREATED_AT`,e.UPDATED_AT=`UPDATED_AT`,e.CREATED_AT_DESC=`CREATED_AT_DESC`,e.UPDATED_AT_DESC=`UPDATED_AT_DESC`})(v||={});var y={"claude-code":{agent_name_patterns:[`claude-agent`],api_key_env_var:`ANTHROPIC_API_KEY`,available_models:[{id:`default`,label:`Default (recommended)`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-5`,label:`Claude Opus 5`},{id:`sonnet`,label:`Claude Sonnet`},{id:`haiku`,label:`Claude Haiku`}],base_url_env_var:`ANTHROPIC_BASE_URL`,binary_name:`claude-agent-acp`,data_dir_env_var:`CLAUDE_CONFIG_DIR`,default_command:[`npx`,`-y`,`--prefer-offline`,`@agentclientprotocol/claude-agent-acp@0.63.0`],default_model:`opus[1m]`,default_session_mode:`bypassPermissions`,display_name:`Claude Code`,env_conflicts:[{dominant:`CLAUDE_CODE_OAUTH_TOKEN`,strip:[`ANTHROPIC_API_KEY`,`ANTHROPIC_BASE_URL`]}],file_secrets:[],key:`claude-code`,session_meta_key:`claudeCode`,supports_runtime_model_switch:!0,supports_set_session_model:!0},codex:{agent_name_patterns:[`codex-acp`],api_key_env_var:`OPENAI_API_KEY`,available_models:[{id:`gpt-6-astra`,label:`GPT-6 Astra`},{id:`gpt-5.6-sol`,label:`GPT-5.6 Sol`},{id:`gpt-5.6-terra`,label:`GPT-5.6 Terra`},{id:`gpt-5.6-luna`,label:`GPT-5.6 Luna`},{id:`gpt-5.5`,label:`GPT-5.5`}],base_url_env_var:`OPENAI_BASE_URL`,binary_name:`codex-acp`,data_dir_env_var:`CODEX_HOME`,default_command:[`npx`,`-y`,`--prefer-offline`,`@agentclientprotocol/codex-acp@1.10.0`],default_model:`gpt-5.5`,default_session_mode:`agent-full-access`,display_name:`Codex`,env_conflicts:[],file_secrets:[{env_points_to:`dir`,env_var:`CODEX_HOME`,filename:`auth.json`,secret_name:`CODEX_AUTH_JSON`,subdir:`codex`,warn_if_unset:[]}],key:`codex`,session_meta_key:null,supports_runtime_model_switch:!0,supports_set_session_model:!0},"gemini-cli":{agent_name_patterns:[`gemini-cli`],api_key_env_var:`GEMINI_API_KEY`,available_models:[{id:`auto`,label:`Auto`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-pro-preview`,label:`Gemini 3 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`}],base_url_env_var:`GEMINI_BASE_URL`,binary_name:`gemini`,data_dir_env_var:`HOME`,default_command:[`npx`,`-y`,`--prefer-offline`,`@google/gemini-cli@0.46.0`,`--acp`],default_model:`auto`,default_session_mode:`default`,display_name:`Gemini CLI`,env_conflicts:[],file_secrets:[{env_points_to:`file`,env_var:`GOOGLE_APPLICATION_CREDENTIALS`,filename:`gcloud-credentials.json`,secret_name:`GOOGLE_APPLICATION_CREDENTIALS_JSON`,subdir:`gemini-cli`,warn_if_unset:[`GOOGLE_CLOUD_PROJECT`,`GOOGLE_CLOUD_LOCATION`]}],key:`gemini-cli`,session_meta_key:null,supports_runtime_model_switch:!0,supports_set_session_model:!0},"kimi-code":{agent_name_patterns:[`kimi`],api_key_env_var:null,available_models:[],base_url_env_var:`KIMI_BASE_URL`,binary_name:`kimi`,data_dir_env_var:`KIMI_CODE_HOME`,default_command:[`npx`,`-y`,`--prefer-offline`,`@moonshot-ai/kimi-code@0.38.0`,`acp`],default_model:null,default_session_mode:`yolo`,display_name:`Kimi Code`,env_conflicts:[],file_secrets:[{env_points_to:`dir`,env_var:`KIMI_CODE_HOME`,filename:`config.toml`,secret_name:`KIMI_CODE_CONFIG_TOML`,subdir:`kimi-code`,warn_if_unset:[]}],key:`kimi-code`,session_meta_key:null,supports_runtime_model_switch:!0,supports_set_session_model:!0},opencode:{agent_name_patterns:[`opencode`],api_key_env_var:`OPENCODE_API_KEY`,available_models:[{id:`opencode/big-pickle`,label:`Big Pickle`},{id:`opencode/claude-opus-5`,label:`Claude Opus 5`},{id:`opencode/claude-sonnet-5`,label:`Claude Sonnet 5`},{id:`opencode/gpt-5.5`,label:`GPT-5.5`},{id:`opencode/gemini-3.1-pro`,label:`Gemini 3.1 Pro`},{id:`opencode/kimi-k3`,label:`Kimi K3`},{id:`opencode/nemotron-3-ultra-free`,label:`Nemotron 3 Ultra (free)`}],base_url_env_var:null,binary_name:`opencode`,data_dir_env_var:`HOME`,default_command:[`npx`,`-y`,`--prefer-offline`,`opencode-ai@1.18.23`,`acp`],default_model:`opencode/big-pickle`,default_session_mode:`build`,display_name:`OpenCode`,env_conflicts:[],file_secrets:[],key:`opencode`,session_meta_key:null,supports_runtime_model_switch:!0,supports_set_session_model:!0},pi:{agent_name_patterns:[`pi-acp`],api_key_env_var:`ANTHROPIC_API_KEY`,available_models:[{id:`anthropic/claude-opus-5`,label:`Claude Opus 5`},{id:`anthropic/claude-opus-4-8`,label:`Claude Opus 4.8`},{id:`anthropic/claude-sonnet-5`,label:`Claude Sonnet 5`},{id:`anthropic/claude-sonnet-4-6`,label:`Claude Sonnet 4.6`},{id:`anthropic/claude-haiku-4-5`,label:`Claude Haiku 4.5`}],base_url_env_var:null,binary_name:`pi-acp`,data_dir_env_var:`HOME`,default_command:[`npx`,`-y`,`--prefer-offline`,`--package=pi-acp@0.0.33`,`--package=@earendil-works/pi-coding-agent@0.83.0`,`pi-acp`],default_model:null,default_session_mode:null,display_name:`Pi`,env_conflicts:[],file_secrets:[{env_points_to:`dir`,env_var:`PI_CODING_AGENT_DIR`,filename:`auth.json`,secret_name:`PI_AUTH_JSON`,subdir:`pi`,warn_if_unset:[]}],key:`pi`,session_meta_key:null,supports_runtime_model_switch:!0,supports_set_session_model:!0}};function b(e){return e?y[e]??null:null}var x=[`acp_command`,`acp_args`,`acp_env`,`acp_model`,`acp_session_mode`,`acp_prompt_timeout`,`acp_server`];export{o as a,d as i,b as n,v as r,x as t};
|