@microsoft/teamsfx-core 3.0.14-alpha.36cd4ecbcb.0 → 3.0.14-alpha.3f4824bc25.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.
Files changed (354) hide show
  1. package/build/client/teamsDevPortalClient.d.ts +7 -2
  2. package/build/client/teamsDevPortalClient.d.ts.map +1 -1
  3. package/build/client/teamsDevPortalClient.js +63 -59
  4. package/build/client/teamsDevPortalClient.js.map +1 -1
  5. package/build/client/teamsGraphClient.d.ts +3 -3
  6. package/build/client/teamsGraphClient.d.ts.map +1 -1
  7. package/build/client/teamsGraphClient.js +3 -3
  8. package/build/client/teamsGraphClient.js.map +1 -1
  9. package/build/common/daSpecParser.d.ts +16 -1
  10. package/build/common/daSpecParser.d.ts.map +1 -1
  11. package/build/common/daSpecParser.js +34 -21
  12. package/build/common/daSpecParser.js.map +1 -1
  13. package/build/common/featureFlags.d.ts +10 -0
  14. package/build/common/featureFlags.d.ts.map +1 -1
  15. package/build/common/featureFlags.js +17 -1
  16. package/build/common/featureFlags.js.map +1 -1
  17. package/build/common/fetchHelper.d.ts.map +1 -1
  18. package/build/common/fetchHelper.js +41 -3
  19. package/build/common/fetchHelper.js.map +1 -1
  20. package/build/common/kiotaClient.d.ts +3 -3
  21. package/build/common/kiotaClient.d.ts.map +1 -1
  22. package/build/common/kiotaClient.js +10 -10
  23. package/build/common/kiotaClient.js.map +1 -1
  24. package/build/common/telemetry.js +2 -2
  25. package/build/common/telemetry.js.map +1 -1
  26. package/build/common/templates-config.json +2 -2
  27. package/build/common/tools.d.ts +6 -1
  28. package/build/common/tools.d.ts.map +1 -1
  29. package/build/common/tools.js +13 -8
  30. package/build/common/tools.js.map +1 -1
  31. package/build/common/wrappedAxiosClient.d.ts +1 -1
  32. package/build/common/wrappedAxiosClient.d.ts.map +1 -1
  33. package/build/common/wrappedAxiosClient.js +12 -13
  34. package/build/common/wrappedAxiosClient.js.map +1 -1
  35. package/build/component/configManager/actionInjector.d.ts +16 -1
  36. package/build/component/configManager/actionInjector.d.ts.map +1 -1
  37. package/build/component/configManager/actionInjector.js +106 -1
  38. package/build/component/configManager/actionInjector.js.map +1 -1
  39. package/build/component/coordinator/index.d.ts +4 -0
  40. package/build/component/coordinator/index.d.ts.map +1 -1
  41. package/build/component/coordinator/index.js +5 -2
  42. package/build/component/coordinator/index.js.map +1 -1
  43. package/build/component/deps-checker/internal/funcToolChecker.d.ts +6 -0
  44. package/build/component/deps-checker/internal/funcToolChecker.d.ts.map +1 -1
  45. package/build/component/deps-checker/internal/funcToolChecker.js +15 -12
  46. package/build/component/deps-checker/internal/funcToolChecker.js.map +1 -1
  47. package/build/component/deps-checker/internal/nodeChecker.js +1 -1
  48. package/build/component/deps-checker/internal/nodeChecker.js.map +1 -1
  49. package/build/component/deps-checker/internal/testToolChecker.d.ts +12 -0
  50. package/build/component/deps-checker/internal/testToolChecker.d.ts.map +1 -1
  51. package/build/component/deps-checker/internal/testToolChecker.js +23 -14
  52. package/build/component/deps-checker/internal/testToolChecker.js.map +1 -1
  53. package/build/component/developerPortalScaffoldUtils.d.ts +11 -1
  54. package/build/component/developerPortalScaffoldUtils.d.ts.map +1 -1
  55. package/build/component/developerPortalScaffoldUtils.js +21 -12
  56. package/build/component/developerPortalScaffoldUtils.js.map +1 -1
  57. package/build/component/driver/aad/utility/aadManifestHelper.d.ts +1 -1
  58. package/build/component/driver/aad/utility/aadManifestHelper.d.ts.map +1 -1
  59. package/build/component/driver/aad/utility/aadManifestHelper.js +7 -4
  60. package/build/component/driver/aad/utility/aadManifestHelper.js.map +1 -1
  61. package/build/component/driver/add/addWebPart.d.ts +9 -0
  62. package/build/component/driver/add/addWebPart.d.ts.map +1 -1
  63. package/build/component/driver/add/addWebPart.js +13 -7
  64. package/build/component/driver/add/addWebPart.js.map +1 -1
  65. package/build/component/driver/arm/util/handleError.d.ts +5 -0
  66. package/build/component/driver/arm/util/handleError.d.ts.map +1 -1
  67. package/build/component/driver/arm/util/handleError.js +10 -5
  68. package/build/component/driver/arm/util/handleError.js.map +1 -1
  69. package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.d.ts +8 -1
  70. package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.d.ts.map +1 -1
  71. package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.js +15 -10
  72. package/build/component/driver/deploy/azure/azureStaticWebAppGetDeploymentTokenDriver.js.map +1 -1
  73. package/build/component/driver/devTool/httpClient.d.ts +4 -0
  74. package/build/component/driver/devTool/httpClient.d.ts.map +1 -1
  75. package/build/component/driver/devTool/httpClient.js +6 -3
  76. package/build/component/driver/devTool/httpClient.js.map +1 -1
  77. package/build/component/driver/m365/acquire.d.ts +13 -1
  78. package/build/component/driver/m365/acquire.d.ts.map +1 -1
  79. package/build/component/driver/m365/acquire.js +16 -8
  80. package/build/component/driver/m365/acquire.js.map +1 -1
  81. package/build/component/driver/oauth/update.d.ts +6 -0
  82. package/build/component/driver/oauth/update.d.ts.map +1 -1
  83. package/build/component/driver/oauth/update.js +8 -4
  84. package/build/component/driver/oauth/update.js.map +1 -1
  85. package/build/component/driver/script/scriptDriver.d.ts +6 -0
  86. package/build/component/driver/script/scriptDriver.d.ts.map +1 -1
  87. package/build/component/driver/script/scriptDriver.js +9 -4
  88. package/build/component/driver/script/scriptDriver.js.map +1 -1
  89. package/build/component/driver/share/utils.d.ts.map +1 -1
  90. package/build/component/driver/share/utils.js +9 -7
  91. package/build/component/driver/share/utils.js.map +1 -1
  92. package/build/component/driver/teamsApp/constants.d.ts +3 -3
  93. package/build/component/driver/teamsApp/constants.d.ts.map +1 -1
  94. package/build/component/driver/teamsApp/constants.js +3 -3
  95. package/build/component/driver/teamsApp/constants.js.map +1 -1
  96. package/build/component/driver/teamsApp/createAppPackage.d.ts +6 -0
  97. package/build/component/driver/teamsApp/createAppPackage.d.ts.map +1 -1
  98. package/build/component/driver/teamsApp/createAppPackage.js +47 -11
  99. package/build/component/driver/teamsApp/createAppPackage.js.map +1 -1
  100. package/build/component/driver/teamsApp/interfaces/ValidationResult.d.ts +6 -0
  101. package/build/component/driver/teamsApp/interfaces/ValidationResult.d.ts.map +1 -1
  102. package/build/component/driver/teamsApp/publishAppPackage.d.ts +4 -0
  103. package/build/component/driver/teamsApp/publishAppPackage.d.ts.map +1 -1
  104. package/build/component/driver/teamsApp/publishAppPackage.js +8 -5
  105. package/build/component/driver/teamsApp/publishAppPackage.js.map +1 -1
  106. package/build/component/driver/teamsApp/syncManifest.d.ts +16 -3
  107. package/build/component/driver/teamsApp/syncManifest.d.ts.map +1 -1
  108. package/build/component/driver/teamsApp/syncManifest.js +28 -18
  109. package/build/component/driver/teamsApp/syncManifest.js.map +1 -1
  110. package/build/component/driver/teamsApp/teamsappMgr.d.ts +4 -0
  111. package/build/component/driver/teamsApp/teamsappMgr.d.ts.map +1 -1
  112. package/build/component/driver/teamsApp/teamsappMgr.js +6 -3
  113. package/build/component/driver/teamsApp/teamsappMgr.js.map +1 -1
  114. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.d.ts +2 -0
  115. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.d.ts.map +1 -1
  116. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js +113 -1
  117. package/build/component/driver/teamsApp/utils/CopilotGptManifestUtils.js.map +1 -1
  118. package/build/component/driver/teamsApp/utils/ManifestUtils.d.ts +4 -0
  119. package/build/component/driver/teamsApp/utils/ManifestUtils.d.ts.map +1 -1
  120. package/build/component/driver/teamsApp/utils/ManifestUtils.js +5 -2
  121. package/build/component/driver/teamsApp/utils/ManifestUtils.js.map +1 -1
  122. package/build/component/driver/teamsApp/utils/McpCertVerification.d.ts +4 -0
  123. package/build/component/driver/teamsApp/utils/McpCertVerification.d.ts.map +1 -1
  124. package/build/component/driver/teamsApp/utils/McpCertVerification.js +12 -5
  125. package/build/component/driver/teamsApp/utils/McpCertVerification.js.map +1 -1
  126. package/build/component/driver/teamsApp/utils/telemetry.d.ts +1 -0
  127. package/build/component/driver/teamsApp/utils/telemetry.d.ts.map +1 -1
  128. package/build/component/driver/teamsApp/utils/telemetry.js +1 -0
  129. package/build/component/driver/teamsApp/utils/telemetry.js.map +1 -1
  130. package/build/component/driver/teamsApp/validate.d.ts.map +1 -1
  131. package/build/component/driver/teamsApp/validate.js +11 -1
  132. package/build/component/driver/teamsApp/validate.js.map +1 -1
  133. package/build/component/driver/teamsApp/validateTestCases.d.ts +12 -0
  134. package/build/component/driver/teamsApp/validateTestCases.d.ts.map +1 -1
  135. package/build/component/driver/teamsApp/validateTestCases.js +17 -8
  136. package/build/component/driver/teamsApp/validateTestCases.js.map +1 -1
  137. package/build/component/driver/typeSpec/compile.d.ts +9 -0
  138. package/build/component/driver/typeSpec/compile.d.ts.map +1 -1
  139. package/build/component/driver/typeSpec/compile.js +16 -10
  140. package/build/component/driver/typeSpec/compile.js.map +1 -1
  141. package/build/component/generator/declarativeAgent/generator.d.ts +8 -0
  142. package/build/component/generator/declarativeAgent/generator.d.ts.map +1 -1
  143. package/build/component/generator/declarativeAgent/generator.js +15 -8
  144. package/build/component/generator/declarativeAgent/generator.js.map +1 -1
  145. package/build/component/generator/declarativeAgent/helper.d.ts +31 -0
  146. package/build/component/generator/declarativeAgent/helper.d.ts.map +1 -1
  147. package/build/component/generator/declarativeAgent/helper.js +237 -34
  148. package/build/component/generator/declarativeAgent/helper.js.map +1 -1
  149. package/build/component/generator/defaultGenerator.js +2 -2
  150. package/build/component/generator/defaultGenerator.js.map +1 -1
  151. package/build/component/generator/generatorAction.d.ts +9 -0
  152. package/build/component/generator/generatorAction.d.ts.map +1 -1
  153. package/build/component/generator/generatorAction.js +16 -8
  154. package/build/component/generator/generatorAction.js.map +1 -1
  155. package/build/component/generator/officeAddin/generator.d.ts +4 -0
  156. package/build/component/generator/officeAddin/generator.d.ts.map +1 -1
  157. package/build/component/generator/officeAddin/generator.js +6 -3
  158. package/build/component/generator/officeAddin/generator.js.map +1 -1
  159. package/build/component/generator/officeAddin/helperMethods.d.ts +4 -0
  160. package/build/component/generator/officeAddin/helperMethods.d.ts.map +1 -1
  161. package/build/component/generator/officeAddin/helperMethods.js +6 -3
  162. package/build/component/generator/officeAddin/helperMethods.js.map +1 -1
  163. package/build/component/generator/openApiSpec/customEngineAgentGenerator.d.ts +9 -0
  164. package/build/component/generator/openApiSpec/customEngineAgentGenerator.d.ts.map +1 -1
  165. package/build/component/generator/openApiSpec/customEngineAgentGenerator.js +11 -5
  166. package/build/component/generator/openApiSpec/customEngineAgentGenerator.js.map +1 -1
  167. package/build/component/generator/spfx/utils/constants.d.ts +1 -1
  168. package/build/component/generator/spfx/utils/constants.js +1 -1
  169. package/build/component/generator/templates/metadata/index.js +5 -5
  170. package/build/component/generator/templates/metadata/index.js.map +1 -1
  171. package/build/component/generator/templates/templateNames.d.ts +2 -0
  172. package/build/component/generator/templates/templateNames.d.ts.map +1 -1
  173. package/build/component/generator/templates/templateNames.js +3 -0
  174. package/build/component/generator/templates/templateNames.js.map +1 -1
  175. package/build/component/generator/utils.js +8 -8
  176. package/build/component/generator/utils.js.map +1 -1
  177. package/build/component/generator/v4MetadataSource.d.ts +2 -2
  178. package/build/component/generator/v4MetadataSource.d.ts.map +1 -1
  179. package/build/component/generator/v4MetadataSource.js +6 -6
  180. package/build/component/generator/v4MetadataSource.js.map +1 -1
  181. package/build/component/generator/v4TemplateBridge.d.ts +11 -0
  182. package/build/component/generator/v4TemplateBridge.d.ts.map +1 -1
  183. package/build/component/generator/v4TemplateBridge.js +17 -6
  184. package/build/component/generator/v4TemplateBridge.js.map +1 -1
  185. package/build/component/local/localCertificateManager.d.ts +17 -1
  186. package/build/component/local/localCertificateManager.d.ts.map +1 -1
  187. package/build/component/local/localCertificateManager.js +48 -31
  188. package/build/component/local/localCertificateManager.js.map +1 -1
  189. package/build/component/m365/packageService.d.ts +5 -0
  190. package/build/component/m365/packageService.d.ts.map +1 -1
  191. package/build/component/m365/packageService.js +32 -12
  192. package/build/component/m365/packageService.js.map +1 -1
  193. package/build/component/middleware/envMW.d.ts.map +1 -1
  194. package/build/component/middleware/envMW.js +5 -0
  195. package/build/component/middleware/envMW.js.map +1 -1
  196. package/build/component/utils/ResourceGroupHelper.d.ts +4 -0
  197. package/build/component/utils/ResourceGroupHelper.d.ts.map +1 -1
  198. package/build/component/utils/ResourceGroupHelper.js +7 -4
  199. package/build/component/utils/ResourceGroupHelper.js.map +1 -1
  200. package/build/component/utils/charsetUtils.js +3 -3
  201. package/build/component/utils/charsetUtils.js.map +1 -1
  202. package/build/component/utils/fileOperation.d.ts +10 -0
  203. package/build/component/utils/fileOperation.d.ts.map +1 -1
  204. package/build/component/utils/fileOperation.js +27 -17
  205. package/build/component/utils/fileOperation.js.map +1 -1
  206. package/build/component/utils/mcpAuthScaffolder.d.ts +106 -0
  207. package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -0
  208. package/build/component/utils/mcpAuthScaffolder.js +153 -0
  209. package/build/component/utils/mcpAuthScaffolder.js.map +1 -0
  210. package/build/component/utils/mcpToolFetcher.d.ts +12 -1
  211. package/build/component/utils/mcpToolFetcher.d.ts.map +1 -1
  212. package/build/component/utils/mcpToolFetcher.js +23 -3
  213. package/build/component/utils/mcpToolFetcher.js.map +1 -1
  214. package/build/component/utils/metadataGraphPermssion.d.ts +4 -0
  215. package/build/component/utils/metadataGraphPermssion.d.ts.map +1 -1
  216. package/build/component/utils/metadataGraphPermssion.js +7 -4
  217. package/build/component/utils/metadataGraphPermssion.js.map +1 -1
  218. package/build/component/utils/odrProvider.d.ts +6 -0
  219. package/build/component/utils/odrProvider.d.ts.map +1 -1
  220. package/build/component/utils/odrProvider.js +9 -4
  221. package/build/component/utils/odrProvider.js.map +1 -1
  222. package/build/core/FxCore.d.ts +44 -0
  223. package/build/core/FxCore.d.ts.map +1 -1
  224. package/build/core/FxCore.declarativeAgent.d.ts +9 -0
  225. package/build/core/FxCore.declarativeAgent.d.ts.map +1 -1
  226. package/build/core/FxCore.declarativeAgent.js +299 -181
  227. package/build/core/FxCore.declarativeAgent.js.map +1 -1
  228. package/build/core/FxCore.js +394 -66
  229. package/build/core/FxCore.js.map +1 -1
  230. package/build/core/FxCore.openPlugin.d.ts +6 -0
  231. package/build/core/FxCore.openPlugin.d.ts.map +1 -1
  232. package/build/core/FxCore.openPlugin.js +8 -4
  233. package/build/core/FxCore.openPlugin.js.map +1 -1
  234. package/build/core/collaborator.d.ts +4 -0
  235. package/build/core/collaborator.d.ts.map +1 -1
  236. package/build/core/collaborator.js +6 -3
  237. package/build/core/collaborator.js.map +1 -1
  238. package/build/core/middleware/concurrentLocker.d.ts +9 -0
  239. package/build/core/middleware/concurrentLocker.d.ts.map +1 -1
  240. package/build/core/middleware/concurrentLocker.js +14 -8
  241. package/build/core/middleware/concurrentLocker.js.map +1 -1
  242. package/build/core/middleware/fileLocker.d.ts +6 -0
  243. package/build/core/middleware/fileLocker.d.ts.map +1 -1
  244. package/build/core/middleware/fileLocker.js +11 -6
  245. package/build/core/middleware/fileLocker.js.map +1 -1
  246. package/build/error/teamsApp.d.ts +3 -0
  247. package/build/error/teamsApp.d.ts.map +1 -1
  248. package/build/error/teamsApp.js +15 -1
  249. package/build/error/teamsApp.js.map +1 -1
  250. package/build/question/create.d.ts +8 -1
  251. package/build/question/create.d.ts.map +1 -1
  252. package/build/question/create.js +24 -15
  253. package/build/question/create.js.map +1 -1
  254. package/build/question/index.d.ts +1 -0
  255. package/build/question/index.d.ts.map +1 -1
  256. package/build/question/index.js +3 -0
  257. package/build/question/index.js.map +1 -1
  258. package/build/question/inputs/AddPluginInputs.d.ts +1 -1
  259. package/build/question/inputs/AddPluginInputs.d.ts.map +1 -1
  260. package/build/question/inputs/AddSkillInputs.d.ts +10 -0
  261. package/build/question/inputs/AddSkillInputs.d.ts.map +1 -0
  262. package/build/question/inputs/AddSkillInputs.js +5 -0
  263. package/build/question/inputs/AddSkillInputs.js.map +1 -0
  264. package/build/question/inputs/CreateProjectInputs.d.ts +7 -1
  265. package/build/question/inputs/CreateProjectInputs.d.ts.map +1 -1
  266. package/build/question/inputs/index.d.ts +1 -0
  267. package/build/question/inputs/index.d.ts.map +1 -1
  268. package/build/question/inputs/index.js +1 -0
  269. package/build/question/inputs/index.js.map +1 -1
  270. package/build/question/options/AddPluginOptions.js +1 -1
  271. package/build/question/options/AddPluginOptions.js.map +1 -1
  272. package/build/question/options/AddSkillOptions.d.ts +4 -0
  273. package/build/question/options/AddSkillOptions.d.ts.map +1 -0
  274. package/build/question/options/AddSkillOptions.js +47 -0
  275. package/build/question/options/AddSkillOptions.js.map +1 -0
  276. package/build/question/options/CreateProjectOptions.d.ts.map +1 -1
  277. package/build/question/options/CreateProjectOptions.js +17 -2
  278. package/build/question/options/CreateProjectOptions.js.map +1 -1
  279. package/build/question/options/index.d.ts +1 -0
  280. package/build/question/options/index.d.ts.map +1 -1
  281. package/build/question/options/index.js +1 -0
  282. package/build/question/options/index.js.map +1 -1
  283. package/build/question/other.d.ts +1 -0
  284. package/build/question/other.d.ts.map +1 -1
  285. package/build/question/other.js +152 -35
  286. package/build/question/other.js.map +1 -1
  287. package/build/question/questionNames.d.ts +10 -1
  288. package/build/question/questionNames.d.ts.map +1 -1
  289. package/build/question/questionNames.js +9 -0
  290. package/build/question/questionNames.js.map +1 -1
  291. package/build/question/scaffold/vsc/CapabilityOptions.d.ts +1 -0
  292. package/build/question/scaffold/vsc/CapabilityOptions.d.ts.map +1 -1
  293. package/build/question/scaffold/vsc/CapabilityOptions.js +11 -0
  294. package/build/question/scaffold/vsc/CapabilityOptions.js.map +1 -1
  295. package/build/question/scaffold/vsc/ProjectTypeOptions.d.ts +2 -0
  296. package/build/question/scaffold/vsc/ProjectTypeOptions.d.ts.map +1 -1
  297. package/build/question/scaffold/vsc/ProjectTypeOptions.js +9 -0
  298. package/build/question/scaffold/vsc/ProjectTypeOptions.js.map +1 -1
  299. package/build/question/scaffold/vsc/rootNode.d.ts.map +1 -1
  300. package/build/question/scaffold/vsc/rootNode.js +6 -4
  301. package/build/question/scaffold/vsc/rootNode.js.map +1 -1
  302. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts +33 -0
  303. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
  304. package/build/question/scaffold/vsc/teamsProjectTypeNode.js +160 -37
  305. package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
  306. package/build/question/share.d.ts +7 -0
  307. package/build/question/share.d.ts.map +1 -1
  308. package/build/question/share.js +7 -3
  309. package/build/question/share.js.map +1 -1
  310. package/build/v4/distribution/templateConfig.d.ts +36 -10
  311. package/build/v4/distribution/templateConfig.d.ts.map +1 -1
  312. package/build/v4/distribution/templateConfig.js +47 -9
  313. package/build/v4/distribution/templateConfig.js.map +1 -1
  314. package/package.json +18 -79
  315. package/resource/package.nls.cs.json +57 -4
  316. package/resource/package.nls.de.json +57 -4
  317. package/resource/package.nls.es.json +57 -4
  318. package/resource/package.nls.fr.json +57 -4
  319. package/resource/package.nls.it.json +57 -4
  320. package/resource/package.nls.ja.json +57 -4
  321. package/resource/package.nls.json +54 -1
  322. package/resource/package.nls.ko.json +57 -4
  323. package/resource/package.nls.pl.json +57 -4
  324. package/resource/package.nls.pt-BR.json +57 -4
  325. package/resource/package.nls.ru.json +57 -4
  326. package/resource/package.nls.tr.json +57 -4
  327. package/resource/package.nls.zh-Hans.json +57 -4
  328. package/resource/package.nls.zh-Hant.json +57 -4
  329. package/resource/templates/package.nls.cs.json +5 -0
  330. package/resource/templates/package.nls.de.json +5 -0
  331. package/resource/templates/package.nls.es.json +5 -0
  332. package/resource/templates/package.nls.fr.json +5 -0
  333. package/resource/templates/package.nls.it.json +5 -0
  334. package/resource/templates/package.nls.ja.json +5 -0
  335. package/resource/templates/package.nls.json +5 -0
  336. package/resource/templates/package.nls.ko.json +5 -0
  337. package/resource/templates/package.nls.pl.json +5 -0
  338. package/resource/templates/package.nls.pt-BR.json +5 -0
  339. package/resource/templates/package.nls.ru.json +5 -0
  340. package/resource/templates/package.nls.tr.json +5 -0
  341. package/resource/templates/package.nls.zh-Hans.json +5 -0
  342. package/resource/templates/package.nls.zh-Hant.json +5 -0
  343. package/templates/fallback/common.zip +0 -0
  344. package/templates/fallback/csharp.zip +0 -0
  345. package/templates/fallback/js.zip +0 -0
  346. package/templates/fallback/python.zip +0 -0
  347. package/templates/fallback/ts.zip +0 -0
  348. package/templates/metadata/allTemplates.json +16 -0
  349. package/templates/metadata/defaultGeneratorTemplates.json +8 -0
  350. package/templates/metadata.zip +0 -0
  351. package/templates/ui/tdpNode.json +7 -0
  352. package/templates/ui/wizardNode.json +33 -0
  353. package/templates/v4/floor.json +1 -1
  354. package/templates/v4/templates.zip +0 -0
@@ -2,7 +2,7 @@
2
2
  // Copyright (c) Microsoft Corporation.
3
3
  // Licensed under the MIT license.
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
- exports.FxCoreDeclarativeAgentPart = void 0;
5
+ exports.FxCoreDeclarativeAgentPart = exports.fxCoreDeclarativeAgentDeps = void 0;
6
6
  const tslib_1 = require("tslib");
7
7
  const hooks_1 = require("@feathersjs/hooks");
8
8
  const m365_spec_parser_1 = require("@microsoft/m365-spec-parser");
@@ -14,7 +14,7 @@ const globalVars_1 = require("../common/globalVars");
14
14
  const localizeUtils_1 = require("../common/localizeUtils");
15
15
  const telemetry_1 = require("../common/telemetry");
16
16
  const versionMetadata_1 = require("../common/versionMetadata");
17
- const actionInjector_1 = require("../component/configManager/actionInjector");
17
+ const featureFlags_1 = require("../common/featureFlags");
18
18
  const constants_1 = require("../component/constants");
19
19
  const errors_1 = require("../component/driver/teamsApp/errors");
20
20
  const results_1 = require("../component/driver/teamsApp/results");
@@ -26,7 +26,7 @@ const helper_1 = require("../component/generator/declarativeAgent/helper");
26
26
  const helper_2 = require("../component/generator/openApiSpec/helper");
27
27
  const questionMW_1 = require("../component/middleware/questionMW");
28
28
  const common_1 = require("../component/utils/common");
29
- const mcpToolFetcher_1 = require("../component/utils/mcpToolFetcher");
29
+ const mcpAuthScaffolder_1 = require("../component/utils/mcpAuthScaffolder");
30
30
  const pathUtils_1 = require("../component/utils/pathUtils");
31
31
  const common_2 = require("../error/common");
32
32
  const constants_2 = require("../question/constants");
@@ -35,6 +35,13 @@ const concurrentLocker_1 = require("./middleware/concurrentLocker");
35
35
  const errorHandler_1 = require("./middleware/errorHandler");
36
36
  // Non-translatable CLI command template used in warning messages
37
37
  const mcpAddActionHint = "atk add action --api-plugin-type mcp --mcp-da-server-url <server-url> --mcp-tools-file-path <path-to-tools-json> --interactive false";
38
+ exports.fxCoreDeclarativeAgentDeps = {
39
+ addExistingPlugin: helper_1.addExistingPlugin,
40
+ createNewActionPluginManifest: helper_1.createNewActionPluginManifest,
41
+ deriveMCPServerNameFromUrl: helper_1.deriveMCPServerNameFromUrl,
42
+ generateFromApiSpec: helper_2.generateFromApiSpec,
43
+ generateScaffoldingSummary: helper_2.generateScaffoldingSummary,
44
+ };
38
45
  class FxCoreDeclarativeAgentPart {
39
46
  async updateActionWithMCP(inputs) {
40
47
  const context = (0, globalVars_1.createContext)();
@@ -60,7 +67,7 @@ class FxCoreDeclarativeAgentPart {
60
67
  return (0, teamsfx_api_1.err)(results_1.AppStudioResultFactory.UserError(errors_1.AppStudioError.TeamsAppRequiredPropertyMissingError.name, errors_1.AppStudioError.TeamsAppRequiredPropertyMissingError.message("declarativeAgents", teamsManifestPath)));
61
68
  }
62
69
  const declarativeAgentManifestPath = path.join(projectPath, teamsfx_api_1.AppPackageFolderName, declarativeAgentRelativePath);
63
- const createRes = await (0, helper_1.createNewActionPluginManifest)(projectPath, desiredFileName, declarativeAgentManifestPath);
70
+ const createRes = await exports.fxCoreDeclarativeAgentDeps.createNewActionPluginManifest(projectPath, desiredFileName, declarativeAgentManifestPath);
64
71
  if (createRes.isErr()) {
65
72
  return (0, teamsfx_api_1.err)(createRes.error);
66
73
  }
@@ -76,19 +83,12 @@ class FxCoreDeclarativeAgentPart {
76
83
  const serverName = inputs[constants_2.QuestionNames.MCPForDAServerName];
77
84
  const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
78
85
  const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
79
- let oauthAuthorizationUrl = undefined;
80
- let oauthTokenUrl = undefined;
81
- let oauthRefreshUrl = undefined;
86
+ let mcpAuthEndpoints = {};
82
87
  let registrationId = undefined;
83
88
  if (mcpAuth === "OAuthPluginVault") {
84
89
  try {
85
90
  registrationId = `MCP_DA_AUTH_ID_${serverName.toUpperCase()}`;
86
- if (authType === "oauth") {
87
- const metadata = await (0, mcpToolFetcher_1.resolveMCPOAuthMetadata)(inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl], inputs[constants_2.QuestionNames.MCPForDAAuthWellKnownUrl]);
88
- oauthAuthorizationUrl = metadata.authorizationUrl;
89
- oauthTokenUrl = metadata.tokenUrl;
90
- oauthRefreshUrl = metadata.refreshUrl;
91
- }
91
+ mcpAuthEndpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
92
92
  }
93
93
  catch (error) {
94
94
  void context.userInteraction.showMessage("error", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message), false);
@@ -104,14 +104,20 @@ class FxCoreDeclarativeAgentPart {
104
104
  const error = new teamsfx_api_1.UserError("MCPForDAPreFetchToolsNotFound", "PreFetchToolsNotFound", (0, localizeUtils_1.getDefaultString)("core.MCPForDA.preFetchToolsNotFound"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.preFetchToolsNotFound"));
105
105
  return (0, teamsfx_api_1.err)(error);
106
106
  }
107
+ const pluginFunctions = Array.isArray(aiPluginContent.functions)
108
+ ? aiPluginContent.functions
109
+ : [];
110
+ const pluginRuntimes = Array.isArray(aiPluginContent.runtimes) ? aiPluginContent.runtimes : [];
107
111
  const toolsSelectedPrevious = [];
108
- aiPluginContent.runtimes
109
- .filter((runtime) => (runtime.type === "RemoteMCPServer" && runtime.spec.url === mcpServerUrl) ||
112
+ pluginRuntimes
113
+ .filter((runtime) => (runtime.type === "RemoteMCPServer" && runtime.spec?.url === mcpServerUrl) ||
110
114
  runtime.type === "LocalPlugin")
111
115
  .forEach((runtime) => {
112
- toolsSelectedPrevious.push(...runtime.run_for_functions);
116
+ if (Array.isArray(runtime.run_for_functions)) {
117
+ toolsSelectedPrevious.push(...runtime.run_for_functions);
118
+ }
113
119
  });
114
- aiPluginContent.functions = aiPluginContent.functions.filter((func) => !toolsSelectedPrevious.includes(func.name));
120
+ aiPluginContent.functions = pluginFunctions.filter((func) => !toolsSelectedPrevious.includes(func.name));
115
121
  aiPluginContent.functions = [
116
122
  ...aiPluginContent.functions,
117
123
  ...mcpToolsDetail
@@ -136,9 +142,9 @@ class FxCoreDeclarativeAgentPart {
136
142
  }
137
143
  }),
138
144
  ];
139
- const matchedRuntime = aiPluginContent.runtimes.find((runtime) => runtime.type === "RemoteMCPServer" && runtime.spec.url === mcpServerUrl);
140
- aiPluginContent.runtimes = aiPluginContent.runtimes.filter((runtime) => (runtime.type !== "RemoteMCPServer" && runtime.type !== "LocalPlugin") ||
141
- runtime.spec.url !== mcpServerUrl);
145
+ const matchedRuntime = pluginRuntimes.find((runtime) => runtime.type === "RemoteMCPServer" && runtime.spec?.url === mcpServerUrl);
146
+ aiPluginContent.runtimes = pluginRuntimes.filter((runtime) => (runtime.type !== "RemoteMCPServer" && runtime.type !== "LocalPlugin") ||
147
+ runtime.spec?.url !== mcpServerUrl);
142
148
  if (inputs[constants_2.QuestionNames.MCPLocalServerIdentifier] != null) {
143
149
  aiPluginContent.runtimes.push({
144
150
  type: "LocalPlugin",
@@ -181,19 +187,21 @@ class FxCoreDeclarativeAgentPart {
181
187
  },
182
188
  },
183
189
  run_for_functions: mcpToolsSelected,
184
- auth: mcpAuth === "OAuthPluginVault" && !!registrationId
185
- ? {
186
- type: "OAuthPluginVault",
187
- reference_id: `$\{\{${registrationId}\}\}`,
188
- }
189
- : {
190
- type: "None",
191
- },
190
+ auth: (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId) ?? {
191
+ type: "None",
192
+ },
192
193
  });
193
194
  }
194
195
  if (mcpAuth === "OAuthPluginVault" && !!registrationId) {
195
196
  // insert oauth info in teamsapp.yaml
196
- await actionInjector_1.ActionInjector.injectCreateOAuthActionForMCP(pathUtils_1.pathUtils.getYmlFilePath(projectPath), authType, serverName, registrationId, mcpServerUrl, oauthAuthorizationUrl, oauthTokenUrl, oauthRefreshUrl);
197
+ await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
198
+ ymlPath: pathUtils_1.pathUtils.getYmlFilePath(projectPath),
199
+ authType,
200
+ authName: serverName,
201
+ registrationId,
202
+ mcpServerUrl,
203
+ endpoints: mcpAuthEndpoints,
204
+ });
197
205
  }
198
206
  void context.userInteraction
199
207
  .showMessage("info", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.updatePluginManifest", aiPluginFilePathRelative), false, "Provision")
@@ -238,10 +246,21 @@ class FxCoreDeclarativeAgentPart {
238
246
  // The CLI flow (below) keeps the original non-interactive behavior of
239
247
  // probing the MCP server, fetching tools and writing ai-plugin.json + yaml
240
248
  // OAuth registration, since the CLI has no equivalent notification UX.
241
- if (isGenerateFromMCP && inputs.platform === teamsfx_api_1.Platform.VSCode) {
249
+ //
250
+ // Under the Dynamic Tool Discovery (DT) flag this early redirect is skipped
251
+ // so that VS Code runs the same inline scaffolder as the CLI — the
252
+ // CodeLens "fetch action" hop is absorbed into add-action itself.
253
+ if (isGenerateFromMCP &&
254
+ inputs.platform === teamsfx_api_1.Platform.VSCode &&
255
+ !featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT)) {
242
256
  return await this.addPluginFromMCP(inputs, context);
243
257
  }
244
- const teamsManifestPath = inputs[constants_2.QuestionNames.ManifestPath];
258
+ // VS Code MCP inline flow (DT on) skips the Teams-manifest picker; infer
259
+ // the path from `projectPath/appPackage/manifest.json` to match the leaner
260
+ // `updateActionWithMCP` UX. CLI and non-MCP flows still supply ManifestPath
261
+ // via the question tree / `--manifest-file`.
262
+ const teamsManifestPath = inputs[constants_2.QuestionNames.ManifestPath] ??
263
+ path.join(inputs.projectPath, teamsfx_api_1.AppPackageFolderName, teamsfx_api_1.ManifestTemplateFileName);
245
264
  const appPackageFolder = path.dirname(teamsManifestPath);
246
265
  // validate the project is valid for adding plugin
247
266
  const manifestRes = await ManifestUtils_1.manifestUtils._readAppManifest(teamsManifestPath);
@@ -265,7 +284,13 @@ class FxCoreDeclarativeAgentPart {
265
284
  return (0, teamsfx_api_1.err)(declarativeCopilotManifesRes.error);
266
285
  }
267
286
  const declarativeCopilotManifest = declarativeCopilotManifesRes.value;
268
- let confirmMessage = (0, localizeUtils_1.getLocalizedString)("core.addApi.confirm", path.relative(inputs.projectPath, appPackageFolder));
287
+ const mcpAuthTypeChoice = inputs[constants_2.QuestionNames.MCPForDAAuthType];
288
+ const mcpTouchesYml = isGenerateFromMCP && mcpAuthTypeChoice && mcpAuthTypeChoice !== "none";
289
+ let confirmMessage = (0, localizeUtils_1.getLocalizedString)(isGenerateFromMCP
290
+ ? mcpTouchesYml
291
+ ? "core.addApi.confirm.mcp.teamsYaml"
292
+ : "core.addApi.confirm.mcp"
293
+ : "core.addApi.confirm", path.relative(inputs.projectPath, appPackageFolder), ...(mcpTouchesYml ? [versionMetadata_1.MetadataV4.configFile] : []));
269
294
  // Will be used if generating from API spec
270
295
  let specParser = undefined;
271
296
  let authNameAndSchemes = [];
@@ -281,12 +306,20 @@ class FxCoreDeclarativeAgentPart {
281
306
  }
282
307
  }
283
308
  // confirm
284
- const confirmRes = await context.userInteraction.showMessage("warn", confirmMessage, true, (0, localizeUtils_1.getLocalizedString)("core.addApi.continue"));
285
- if (confirmRes.isErr()) {
286
- return (0, teamsfx_api_1.err)(confirmRes.error);
287
- }
288
- else if (confirmRes.value !== (0, localizeUtils_1.getLocalizedString)("core.addApi.continue")) {
289
- return (0, teamsfx_api_1.err)(new common_2.UserCancelError());
309
+ // VS Code MCP inline flow (DT on) skips the confirmation modal to match
310
+ // the leaner `updateActionWithMCP` UX; writes happen as soon as the last
311
+ // required answer is provided. CLI interactive and other flows still show it.
312
+ const skipConfirmModal = isGenerateFromMCP &&
313
+ inputs.platform === teamsfx_api_1.Platform.VSCode &&
314
+ featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT);
315
+ if (!skipConfirmModal) {
316
+ const confirmRes = await context.userInteraction.showMessage("warn", confirmMessage, true, (0, localizeUtils_1.getLocalizedString)("core.addApi.continue"));
317
+ if (confirmRes.isErr()) {
318
+ return (0, teamsfx_api_1.err)(confirmRes.error);
319
+ }
320
+ else if (confirmRes.value !== (0, localizeUtils_1.getLocalizedString)("core.addApi.continue")) {
321
+ return (0, teamsfx_api_1.err)(new common_2.UserCancelError());
322
+ }
290
323
  }
291
324
  // find the next available action id
292
325
  let actionId = "";
@@ -303,7 +336,7 @@ class FxCoreDeclarativeAgentPart {
303
336
  destinationPluginManifestPath =
304
337
  await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
305
338
  const destinationApiSpecPath = await PluginManifestUtils_1.pluginManifestUtils.getDefaultNextAvailableApiSpecPath(inputs[constants_2.QuestionNames.ApiSpecLocation].trim(), path.join(appPackageFolder, teamsfx_api_1.DefaultApiSpecFolderName));
306
- const generateRes = await (0, helper_2.generateFromApiSpec)(specParser, teamsManifestPath, inputs, context, teamsfx_api_1.Stage.addPlugin, m365_spec_parser_1.ProjectType.Copilot, {
339
+ const generateRes = await exports.fxCoreDeclarativeAgentDeps.generateFromApiSpec(specParser, teamsManifestPath, inputs, context, teamsfx_api_1.Stage.addPlugin, m365_spec_parser_1.ProjectType.Copilot, {
307
340
  destinationApiSpecFilePath: destinationApiSpecPath,
308
341
  pluginManifestFilePath: destinationPluginManifestPath,
309
342
  }, inputs[constants_2.QuestionNames.ApiSpecLocation].trim());
@@ -312,7 +345,7 @@ class FxCoreDeclarativeAgentPart {
312
345
  }
313
346
  const warnings = generateRes.value.warnings;
314
347
  if (warnings && warnings.length > 0) {
315
- const warnSummary = await (0, helper_2.generateScaffoldingSummary)(warnings, manifestRes.value, path.relative(inputs.projectPath, destinationApiSpecPath), path.relative(inputs.projectPath, destinationPluginManifestPath), inputs.projectPath);
348
+ const warnSummary = await exports.fxCoreDeclarativeAgentDeps.generateScaffoldingSummary(warnings, manifestRes.value, path.relative(inputs.projectPath, destinationApiSpecPath), path.relative(inputs.projectPath, destinationPluginManifestPath), inputs.projectPath);
316
349
  context.logProvider.info(warnSummary + "\n");
317
350
  }
318
351
  const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
@@ -333,175 +366,260 @@ class FxCoreDeclarativeAgentPart {
333
366
  if (!mcpServerUrl) {
334
367
  return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPServerUrl", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingServerUrl"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingServerUrl")));
335
368
  }
336
- // Load tools from file if provided and not yet loaded
337
- const existingTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
338
- if (toolsFilePath && (!existingTools || existingTools.length === 0)) {
339
- try {
340
- const { readMCPToolsFromFile } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
341
- const fileTools = await readMCPToolsFromFile(toolsFilePath);
342
- inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = fileTools;
343
- if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
344
- inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = fileTools.map((t) => t.name);
345
- }
346
- }
347
- catch {
348
- mcpWarnings.push({
349
- type: "mcpToolsFileReadError",
350
- content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.toolsFileReadError", toolsFilePath, mcpAddActionHint),
351
- });
352
- }
353
- }
354
- // Probe auth if tools were loaded from file but auth not yet detected
355
- if (inputs[constants_2.QuestionNames.MCPForDAAvailableTools]?.length > 0 &&
356
- !inputs[constants_2.QuestionNames.MCPForDAAuth] &&
357
- mcpServerUrl) {
358
- try {
359
- const { probeMCPServerAuth } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
360
- const authProbe = await probeMCPServerAuth(mcpServerUrl);
361
- if (authProbe.requiresAuth) {
362
- inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
363
- if (authProbe.authMetadataUrl) {
364
- inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = authProbe.authMetadataUrl;
365
- }
366
- }
367
- }
368
- catch {
369
- // Auth probe failed - continue without auth
369
+ // Dynamic Tool Discovery flow: skip static tool fetching entirely;
370
+ // write ai-plugin.json with a `ModelContextProtocol` runtime that the
371
+ // agent host probes for tools at runtime, then inject the OAuth/DCR step.
372
+ if (featureFlags_1.featureFlagManager.getBooleanValue(featureFlags_1.FeatureFlags.MCPForDADT)) {
373
+ destinationPluginManifestPath =
374
+ await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
375
+ // Namespace the action by the MCP server host (shared rule with the
376
+ // create flow) so actions targeting different MCP servers get distinct
377
+ // namespaces. The derived value is alphanumeric + lowercase, satisfying
378
+ // the plugin manifest schema (which rejects `_` and other punctuation).
379
+ const namespace = (0, helper_1.deriveMCPNamespaceFromUrl)(mcpServerUrl);
380
+ const pluginManifest = {
381
+ $schema: "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
382
+ schema_version: "v2.4",
383
+ name_for_human: "MCP Action",
384
+ description_for_human: "Action powered by MCP server",
385
+ contact_email: "publisher-email@example.com",
386
+ namespace,
387
+ functions: [],
388
+ runtimes: [
389
+ {
390
+ type: "RemoteMCPServer",
391
+ spec: { url: mcpServerUrl },
392
+ run_for_functions: ["*"],
393
+ },
394
+ ],
395
+ };
396
+ const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
397
+ if (authType === "none") {
398
+ pluginManifest.runtimes[0].auth = { type: "None" };
370
399
  }
371
- }
372
- // Auto-fetch tools if not yet loaded (CLI flow for no-auth servers)
373
- const currentTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
374
- if ((!currentTools || currentTools.length === 0) && mcpServerUrl) {
375
- try {
376
- const { fetchMCPTools } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
377
- const result = await fetchMCPTools(mcpServerUrl);
378
- if (!result.requiresAuth && result.tools.length > 0) {
379
- inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = result.tools;
380
- if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
381
- inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = result.tools.map((t) => t.name);
382
- }
400
+ else if (authType) {
401
+ const serverName = (0, helper_1.deriveMCPServerNameFromUrl)(mcpServerUrl).toUpperCase();
402
+ const registrationId = (0, helper_1.deriveMCPRegistrationIdFromUrl)(mcpServerUrl);
403
+ const manifestOAuth = (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId);
404
+ if (manifestOAuth) {
405
+ pluginManifest.runtimes[0].auth = manifestOAuth;
383
406
  }
384
- else if (result.requiresAuth) {
385
- // Store auth metadata for later use
386
- inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
387
- if (result.authMetadataUrl) {
388
- inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = result.authMetadataUrl;
407
+ try {
408
+ const endpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
409
+ const ymlPath = pathUtils_1.pathUtils.getYmlFilePath(inputs.projectPath);
410
+ if (ymlPath) {
411
+ await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
412
+ ymlPath,
413
+ authType,
414
+ // Per SCN-DA-CREATE-WITH-MCP-SERVER the `name:` of the injected
415
+ // oauth/dcr step matches the ai-plugin.json `namespace`, not the
416
+ // declarativeAgent action id (which stays the template default).
417
+ authName: namespace,
418
+ registrationId,
419
+ mcpServerUrl,
420
+ endpoints,
421
+ persistCredentialEnvRefs: true,
422
+ serverName,
423
+ });
389
424
  }
390
- mcpWarnings.push({
391
- type: "mcpAuthRequired",
392
- content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.authRequired", mcpServerUrl, mcpAddActionHint),
425
+ await (0, mcpAuthScaffolder_1.persistMCPAuthCredentialEnvVars)({
426
+ projectPath: inputs.projectPath,
427
+ authType,
428
+ serverName,
429
+ clientId: inputs[constants_2.QuestionNames.MCPForDAClientId],
430
+ clientSecret: inputs[constants_2.QuestionNames.MCPForDAClientSecret],
431
+ scopes: inputs[constants_2.QuestionNames.MCPForDAScopes],
393
432
  });
394
433
  }
395
- else {
434
+ catch (error) {
396
435
  mcpWarnings.push({
397
- type: "mcpNoToolsFetched",
398
- content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.noToolsFetched", mcpServerUrl, mcpAddActionHint),
436
+ type: "mcpAuthMetadataError",
437
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message),
399
438
  });
400
439
  }
401
440
  }
402
- catch {
403
- mcpWarnings.push({
404
- type: "mcpFetchError",
405
- content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.fetchError", mcpServerUrl, mcpAddActionHint),
406
- });
441
+ await fs_extra_1.default.ensureFile(destinationPluginManifestPath);
442
+ await fs_extra_1.default.writeJSON(destinationPluginManifestPath, pluginManifest, { spaces: 4 });
443
+ const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
444
+ if (addActionRes.isErr()) {
445
+ return (0, teamsfx_api_1.err)(addActionRes.error);
407
446
  }
408
- }
409
- // If no tools available (auth required or fetch failed), skip creating plugin - just warn
410
- const mcpTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
411
- const mcpToolsSelected = inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] || [];
412
- if (!mcpTools || mcpTools.length === 0 || mcpToolsSelected.length === 0) {
413
447
  if (mcpWarnings.length > 0) {
414
448
  for (const warning of mcpWarnings) {
415
449
  context.logProvider.warning(warning.content);
416
450
  }
417
451
  }
418
- return (0, teamsfx_api_1.ok)(undefined);
419
452
  }
420
- destinationPluginManifestPath =
421
- await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
422
- const pluginManifest = {
423
- $schema: "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
424
- schema_version: "v2.4",
425
- name_for_human: "MCP Action",
426
- description_for_human: "Action powered by MCP server",
427
- contact_email: "publisher-email@example.com",
428
- namespace: "mcpAction",
429
- functions: [],
430
- runtimes: [],
431
- };
432
- if (mcpTools && mcpTools.length > 0 && mcpToolsSelected.length > 0) {
433
- const selectedTools = mcpTools.filter((tool) => mcpToolsSelected.includes(tool.name));
434
- pluginManifest.functions = selectedTools.map((tool) => ({
435
- name: tool.name,
436
- description: tool.description || "",
437
- }));
438
- // Write mcp-tools file with full tool definitions (no field filtering)
439
- const mcpToolsFile = `mcp-tools-${suffix}.json`;
440
- const mcpToolsOutputPath = path.join(appPackageFolder, mcpToolsFile);
441
- await fs_extra_1.default.writeJSON(mcpToolsOutputPath, { tools: selectedTools }, { spaces: 4 });
442
- pluginManifest.runtimes = [
443
- {
444
- type: "RemoteMCPServer",
445
- spec: {
446
- url: mcpServerUrl,
447
- mcp_tool_description: {
448
- file: mcpToolsFile,
449
- },
450
- },
451
- run_for_functions: pluginManifest.functions.map((f) => f.name),
452
- },
453
- ];
454
- // Auth handling
455
- const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
456
- if (mcpAuth === "OAuthPluginVault") {
457
- const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
458
- if (!authType) {
459
- return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPAuthType", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType")));
453
+ else {
454
+ // Load tools from file if provided and not yet loaded
455
+ const existingTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
456
+ if (toolsFilePath && (!existingTools || existingTools.length === 0)) {
457
+ try {
458
+ const { readMCPToolsFromFile } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
459
+ const fileTools = await readMCPToolsFromFile(toolsFilePath);
460
+ inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = fileTools;
461
+ if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
462
+ inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = fileTools.map((t) => t.name);
463
+ }
460
464
  }
461
- const registrationId = `MCP_DA_AUTH_ID_${actionId.toUpperCase()}`;
462
- pluginManifest.runtimes[0].auth = {
463
- type: "OAuthPluginVault",
464
- reference_id: `$\{\{${registrationId}\}\}`,
465
- };
466
- // Resolve OAuth metadata and inject oauth/register into m365agents.yml
465
+ catch {
466
+ mcpWarnings.push({
467
+ type: "mcpToolsFileReadError",
468
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.toolsFileReadError", toolsFilePath, mcpAddActionHint),
469
+ });
470
+ }
471
+ }
472
+ // Probe auth if tools were loaded from file but auth not yet detected
473
+ if (inputs[constants_2.QuestionNames.MCPForDAAvailableTools]?.length > 0 &&
474
+ !inputs[constants_2.QuestionNames.MCPForDAAuth] &&
475
+ mcpServerUrl) {
467
476
  try {
468
- let authorizationUrl;
469
- let tokenUrl;
470
- let refreshUrl;
471
- if (authType === "oauth") {
472
- const metadata = await (0, mcpToolFetcher_1.resolveMCPOAuthMetadata)(inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl]);
473
- authorizationUrl = metadata.authorizationUrl;
474
- tokenUrl = metadata.tokenUrl;
475
- refreshUrl = metadata.refreshUrl;
477
+ const { probeMCPServerAuth } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
478
+ const authProbe = await probeMCPServerAuth(mcpServerUrl);
479
+ if (authProbe.requiresAuth) {
480
+ inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
481
+ if (authProbe.authMetadataUrl) {
482
+ inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = authProbe.authMetadataUrl;
483
+ }
476
484
  }
477
- const ymlPath = pathUtils_1.pathUtils.getYmlFilePath(inputs.projectPath);
478
- if (ymlPath) {
479
- await actionInjector_1.ActionInjector.injectCreateOAuthActionForMCP(ymlPath, authType, actionId, registrationId, mcpServerUrl, authorizationUrl, tokenUrl, refreshUrl);
485
+ }
486
+ catch {
487
+ // Auth probe failed - continue without auth
488
+ }
489
+ }
490
+ // Auto-fetch tools if not yet loaded (CLI flow for no-auth servers)
491
+ const currentTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
492
+ if ((!currentTools || currentTools.length === 0) && mcpServerUrl) {
493
+ try {
494
+ const { fetchMCPTools } = await Promise.resolve().then(() => tslib_1.__importStar(require("../component/utils/mcpToolFetcher")));
495
+ const result = await fetchMCPTools(mcpServerUrl);
496
+ if (!result.requiresAuth && result.tools.length > 0) {
497
+ inputs[constants_2.QuestionNames.MCPForDAAvailableTools] = result.tools;
498
+ if (!inputs[constants_2.QuestionNames.MCPForDAPreFetchTools]) {
499
+ inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] = result.tools.map((t) => t.name);
500
+ }
501
+ }
502
+ else if (result.requiresAuth) {
503
+ // Store auth metadata for later use
504
+ inputs[constants_2.QuestionNames.MCPForDAAuth] = "OAuthPluginVault";
505
+ if (result.authMetadataUrl) {
506
+ inputs[constants_2.QuestionNames.MCPForDAAuthMetadataUrl] = result.authMetadataUrl;
507
+ }
508
+ mcpWarnings.push({
509
+ type: "mcpAuthRequired",
510
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.authRequired", mcpServerUrl, mcpAddActionHint),
511
+ });
512
+ }
513
+ else {
514
+ mcpWarnings.push({
515
+ type: "mcpNoToolsFetched",
516
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.noToolsFetched", mcpServerUrl, mcpAddActionHint),
517
+ });
480
518
  }
481
519
  }
482
- catch (error) {
520
+ catch {
483
521
  mcpWarnings.push({
484
- type: "mcpAuthMetadataError",
485
- content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message),
522
+ type: "mcpFetchError",
523
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.fetchError", mcpServerUrl, mcpAddActionHint),
486
524
  });
487
525
  }
488
526
  }
489
- }
490
- await fs_extra_1.default.ensureFile(destinationPluginManifestPath);
491
- await fs_extra_1.default.writeJSON(destinationPluginManifestPath, pluginManifest, { spaces: 4 });
492
- const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
493
- if (addActionRes.isErr()) {
494
- return (0, teamsfx_api_1.err)(addActionRes.error);
495
- }
496
- // Surface warnings for CLI
497
- if (mcpWarnings.length > 0) {
498
- for (const warning of mcpWarnings) {
499
- context.logProvider.warning(warning.content);
527
+ // If no tools available (auth required or fetch failed), skip creating plugin - just warn
528
+ const mcpTools = inputs[constants_2.QuestionNames.MCPForDAAvailableTools];
529
+ const mcpToolsSelected = inputs[constants_2.QuestionNames.MCPForDAPreFetchTools] || [];
530
+ if (!mcpTools || mcpTools.length === 0 || mcpToolsSelected.length === 0) {
531
+ if (mcpWarnings.length > 0) {
532
+ for (const warning of mcpWarnings) {
533
+ context.logProvider.warning(warning.content);
534
+ }
535
+ }
536
+ return (0, teamsfx_api_1.ok)(undefined);
537
+ }
538
+ destinationPluginManifestPath =
539
+ await CopilotGptManifestUtils_1.copilotGptManifestUtils.getDefaultNextAvailablePluginManifestPath(appPackageFolder, undefined);
540
+ const pluginManifest = {
541
+ $schema: "https://developer.microsoft.com/json-schemas/copilot/plugin/v2.4/schema.json",
542
+ schema_version: "v2.4",
543
+ name_for_human: "MCP Action",
544
+ description_for_human: "Action powered by MCP server",
545
+ contact_email: "publisher-email@example.com",
546
+ namespace: "mcpAction",
547
+ functions: [],
548
+ runtimes: [],
549
+ };
550
+ if (mcpTools && mcpTools.length > 0 && mcpToolsSelected.length > 0) {
551
+ const selectedTools = mcpTools.filter((tool) => mcpToolsSelected.includes(tool.name));
552
+ pluginManifest.functions = selectedTools.map((tool) => ({
553
+ name: tool.name,
554
+ description: tool.description || "",
555
+ }));
556
+ // Write mcp-tools file with full tool definitions (no field filtering)
557
+ const mcpToolsFile = `mcp-tools-${suffix}.json`;
558
+ const mcpToolsOutputPath = path.join(appPackageFolder, mcpToolsFile);
559
+ await fs_extra_1.default.writeJSON(mcpToolsOutputPath, { tools: selectedTools }, { spaces: 4 });
560
+ pluginManifest.runtimes = [
561
+ {
562
+ type: "RemoteMCPServer",
563
+ spec: {
564
+ url: mcpServerUrl,
565
+ mcp_tool_description: {
566
+ file: mcpToolsFile,
567
+ },
568
+ },
569
+ run_for_functions: pluginManifest.functions.map((f) => f.name),
570
+ },
571
+ ];
572
+ // Auth handling
573
+ const mcpAuth = inputs[constants_2.QuestionNames.MCPForDAAuth];
574
+ if (mcpAuth === "OAuthPluginVault") {
575
+ const authType = inputs[constants_2.QuestionNames.MCPForDAAuthType];
576
+ if (!authType) {
577
+ return (0, teamsfx_api_1.err)(new teamsfx_api_1.UserError(teamsfx_api_1.Stage.addPlugin, "MissingMCPAuthType", (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType"), (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.missingAuthType")));
578
+ }
579
+ const registrationId = `MCP_DA_AUTH_ID_${actionId.toUpperCase()}`;
580
+ const manifestOAuth = (0, mcpAuthScaffolder_1.deriveMCPManifestOAuth)(authType, registrationId);
581
+ if (manifestOAuth) {
582
+ pluginManifest.runtimes[0].auth = manifestOAuth;
583
+ }
584
+ // Resolve OAuth metadata and inject oauth/register into m365agents.yml
585
+ try {
586
+ const endpoints = await (0, mcpAuthScaffolder_1.resolveMCPAuthEndpoints)(authType, inputs);
587
+ const ymlPath = pathUtils_1.pathUtils.getYmlFilePath(inputs.projectPath);
588
+ if (ymlPath) {
589
+ await (0, mcpAuthScaffolder_1.injectMCPAuthActionToYml)({
590
+ ymlPath,
591
+ authType,
592
+ authName: actionId,
593
+ registrationId,
594
+ mcpServerUrl,
595
+ endpoints,
596
+ });
597
+ }
598
+ }
599
+ catch (error) {
600
+ mcpWarnings.push({
601
+ type: "mcpAuthMetadataError",
602
+ content: (0, localizeUtils_1.getLocalizedString)("core.MCPForDA.mcpAuthMetadataMissingError", error.message),
603
+ });
604
+ }
605
+ }
606
+ }
607
+ await fs_extra_1.default.ensureFile(destinationPluginManifestPath);
608
+ await fs_extra_1.default.writeJSON(destinationPluginManifestPath, pluginManifest, { spaces: 4 });
609
+ const addActionRes = await CopilotGptManifestUtils_1.copilotGptManifestUtils.addAction(declarativeCopilotManifestPath, actionId, (0, utils_1.normalizePath)(path.relative(appPackageFolder, destinationPluginManifestPath), true));
610
+ if (addActionRes.isErr()) {
611
+ return (0, teamsfx_api_1.err)(addActionRes.error);
612
+ }
613
+ // Surface warnings for CLI
614
+ if (mcpWarnings.length > 0) {
615
+ for (const warning of mcpWarnings) {
616
+ context.logProvider.warning(warning.content);
617
+ }
500
618
  }
501
619
  }
502
620
  }
503
621
  else {
504
- const addPluginRes = await (0, helper_1.addExistingPlugin)(declarativeCopilotManifestPath, inputs[constants_2.QuestionNames.PluginManifestFilePath].trim(), inputs[constants_2.QuestionNames.PluginOpenApiSpecFilePath].trim(), actionId, context, teamsfx_api_1.Stage.addPlugin);
622
+ const addPluginRes = await exports.fxCoreDeclarativeAgentDeps.addExistingPlugin(declarativeCopilotManifestPath, inputs[constants_2.QuestionNames.PluginManifestFilePath].trim(), inputs[constants_2.QuestionNames.PluginOpenApiSpecFilePath].trim(), actionId, context, teamsfx_api_1.Stage.addPlugin);
505
623
  if (addPluginRes.isErr()) {
506
624
  return (0, teamsfx_api_1.err)(addPluginRes.error);
507
625
  }
@@ -541,7 +659,7 @@ class FxCoreDeclarativeAgentPart {
541
659
  }
542
660
  // Derive a server entry name from the URL host using the same logic as the
543
661
  // "DA with MCP" scaffolding template variable `ServerName`.
544
- const serverName = (0, helper_1.deriveMCPServerNameFromUrl)(mcpServerUrl);
662
+ const serverName = exports.fxCoreDeclarativeAgentDeps.deriveMCPServerNameFromUrl(mcpServerUrl);
545
663
  const mcpConfigDir = path.join(projectPath, ".vscode");
546
664
  const mcpConfigPath = path.join(mcpConfigDir, "mcp.json");
547
665
  let mcpConfig = { servers: {} };