33 * SPDX-License-Identifier: Apache-2.0
44 */
55
6- import type { AgentSettings , ContextToken , EmbeddingDemands , FormFulfillments , Fulfillments } from 'agentstack-sdk' ;
6+ import type {
7+ AgentSettings ,
8+ Connector ,
9+ ContextToken ,
10+ EmbeddingDemands ,
11+ FormFulfillments ,
12+ Fulfillments ,
13+ } from 'agentstack-sdk' ;
14+ import { ConnectorState } from 'agentstack-sdk' ;
715
816import { BASE_URL } from '#utils/constants.ts' ;
9- import type { FeatureFlags } from '#utils/feature-flags.ts' ;
1017
1118interface BuildFulfillmentsParams {
1219 contextToken : ContextToken ;
@@ -17,7 +24,7 @@ interface BuildFulfillmentsParams {
1724 selectedSettings : AgentSettings ;
1825 formFulfillments : FormFulfillments ;
1926 oauthRedirectUri : string | null ;
20- featureFlags : FeatureFlags ;
27+ connectors : Connector [ ] ;
2128}
2229
2330export const buildFulfillments = ( {
@@ -29,7 +36,7 @@ export const buildFulfillments = ({
2936 providedSecrets,
3037 formFulfillments,
3138 oauthRedirectUri,
32- featureFlags ,
39+ connectors ,
3340} : BuildFulfillmentsParams ) : Fulfillments => {
3441 return {
3542 getContextToken : ( ) => contextToken ,
@@ -105,27 +112,47 @@ export const buildFulfillments = ({
105112 ) ;
106113 } ,
107114 mcp : async ( { mcp_demands } ) => {
108- if ( ! featureFlags . MCP ) {
109- return {
110- mcp_fulfillments : { } ,
111- } ;
112- }
113-
115+ const connectedConnectors = connectors . filter ( ( connector ) => connector . state === ConnectorState . Connected ) ;
114116 const allDemands = Object . keys ( mcp_demands ) ;
117+ const mcp_fulfillments : Record < string , any > = { } ;
115118
116- return allDemands . reduce (
117- ( memo , demandKey ) => {
118- memo . mcp_fulfillments [ demandKey ] = {
119+ for ( const demandKey of allDemands ) {
120+ const clientProvided = selectedMCPServers [ demandKey ] ;
121+ if ( clientProvided ) {
122+ mcp_fulfillments [ demandKey ] = {
119123 transport : {
120124 type : 'streamable_http' ,
121- url : selectedMCPServers [ demandKey ] ,
125+ url : clientProvided ,
122126 } ,
123127 } ;
124128
125- return memo ;
126- } ,
127- { mcp_fulfillments : { } } ,
128- ) ;
129+ continue ;
130+ }
131+
132+ const demand = mcp_demands [ demandKey ] ;
133+ const suggestedNames = demand . suggested || [ ] ;
134+
135+ // TODO: what if we have multiple connectors with the same name?
136+ // currently we just randomly pick the latest connector
137+ const matchingConnectors = connectedConnectors . filter ( ( connector ) =>
138+ suggestedNames . some (
139+ ( suggestedName ) => connector . metadata ?. name ?. toLowerCase ( ) === suggestedName . toLowerCase ( ) ,
140+ ) ,
141+ ) ;
142+
143+ if ( matchingConnectors . length > 0 ) {
144+ const latestConnector = matchingConnectors [ matchingConnectors . length - 1 ] ;
145+
146+ mcp_fulfillments [ demandKey ] = {
147+ transport : {
148+ type : 'streamable_http' ,
149+ url : `{platform_url}/api/v1/connectors/${ latestConnector . id } /mcp` ,
150+ } ,
151+ } ;
152+ }
153+ }
154+
155+ return { mcp_fulfillments } ;
129156 } ,
130157 oauth : async ( ) => {
131158 return {
0 commit comments