Skip to main content
Glama

mcp-google-sheets

index.ts12.6 kB
import { microsoftSharePointAuth } from '../../'; import { DropdownOption, DynamicPropsValue, PiecePropValueSchema, Property, } from '@activepieces/pieces-framework'; import { Client, PageCollection } from '@microsoft/microsoft-graph-client'; import { Site, Drive, List, ListItem, ColumnDefinition, DriveItem, } from '@microsoft/microsoft-graph-types'; const createDriveDropdown = (params: { displayName: string; refreshers: string[]; }) => Property.Dropdown({ displayName: params.displayName, required: true, refreshers: params.refreshers, options: async ({ auth, ...props }) => { const siteId = props[params.refreshers[0]]; if (!auth || !siteId) { return { disabled: true, placeholder: 'Please select a site first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api(`/sites/${siteId}/drives`) .select('id,name') .get(); while (response.value.length > 0) { for (const drive of response.value as Drive[]) { options.push({ label: drive.name!, value: drive.id! }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options, }; }, }); export const microsoftSharePointCommon = { siteId: Property.Dropdown({ displayName: 'Site', required: true, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Please connect your account first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api('/sites?search=*&$select=displayName,id,name') .get(); while (response.value.length > 0) { for (const site of response.value as Site[]) { options.push({ label: site.displayName!, value: site.id! }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options, }; }, }), driveId: createDriveDropdown({ displayName: 'Drive', refreshers: ['siteId'], }), createDriveDropdown, itemId: Property.Dropdown({ displayName: 'Source File or Folder', required: true, refreshers: ['siteId', 'driveId'], options: async ({ auth, siteId, driveId }) => { if (!auth || !siteId || !driveId) { return { disabled: true, placeholder: 'Please select a site and drive first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api( `/sites/${siteId}/drives/${driveId}/root/children?$select=id,name,folder,file` ) .get(); while (response.value.length > 0) { for (const item of response.value as DriveItem[]) { const prefix = item.folder ? '[Folder] ' : '[File] '; options.push({ label: prefix + item.name!, value: item.id!, }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options }; }, }), destinationFolderId: Property.Dropdown({ displayName: 'Destination Folder', description: 'The folder to copy the item into. Defaults to the root of the drive.', required: false, refreshers: ['destination_site_id', 'destination_drive_id'], options: async ({ auth, ...props }) => { const siteId = props['destination_site_id']; const driveId = props['destination_drive_id']; if (!auth || !siteId || !driveId) { return { disabled: true, placeholder: 'Select a destination site and drive first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api( `/sites/${siteId}/drives/${driveId}/root/children?$filter=folder ne null&$select=id,name` ) .get(); while (response.value.length > 0) { for (const item of response.value as DriveItem[]) { options.push({ label: item.name!, value: item.id!, }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options }; }, }), listId: Property.Dropdown({ displayName: 'List', required: true, refreshers: ['siteId'], options: async ({ auth, siteId }) => { if (!auth || !siteId) { return { disabled: true, placeholder: 'Please select a site first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api(`/sites/${siteId}/lists`) .select('displayName,id') .get(); while (response.value.length > 0) { for (const list of response.value as List[]) { options.push({ label: list.displayName!, value: list.id! }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options, }; }, }), listColumns: Property.DynamicProperties({ displayName: 'List Columns', refreshers: ['siteId', 'listId'], required: true, props: async ({ auth, siteId, listId }) => { if (!auth || !siteId || !listId) return {}; const fields: DynamicPropsValue = {}; const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const columns: ColumnDefinition[] = []; let response: PageCollection = await client .api(`/sites/${siteId}/lists/${listId}/columns`) .get(); while (response.value.length > 0) { for (const column of response.value as ColumnDefinition[]) { if (!column.readOnly) { columns.push(column); } } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } for (const column of columns) { const params = { displayName: column.displayName!, description: column.description ?? '', required: false, }; if (column.boolean) { fields[column.name!] = Property.Checkbox(params); } else if (column.text) { fields[column.name!] = Property.LongText(params); } else if (column.dateTime) { fields[column.name!] = Property.DateTime(params); } else if (column.choice) { if (column.choice.displayAs === 'checkBoxes') { fields[column.name!] = Property.StaticMultiSelectDropdown({ ...params, options: { disabled: false, options: column.choice?.choices ? column.choice.choices.map((choice: string) => ({ label: choice, value: choice, })) : [], }, }); } else { fields[column.name!] = Property.StaticDropdown({ ...params, options: { disabled: false, options: column.choice?.choices ? column.choice.choices.map((choice: string) => ({ label: choice, value: choice, })) : [], }, }); } } else if (column.number) { fields[column.name!] = Property.Number(params); } else if (column.currency) { fields[column.name!] = Property.Number(params); } } return fields; }, }), listItemId: Property.Dropdown({ displayName: 'List Item', required: true, refreshers: ['siteId', 'listId'], options: async ({ auth, siteId, listId }) => { if (!auth || !siteId || !listId) { return { disabled: true, placeholder: 'Please select a site and list first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api( `/sites/${siteId}/lists/${listId}/items?$select=id&$expand=fields($select=Title)` ) .get(); while (response.value.length > 0) { for (const item of response.value as ListItem[]) { options.push({ label: (item.fields as any).Title ?? `Item ${item.id}`, value: item.id!, }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options, }; }, }), pageId: Property.Dropdown({ displayName: 'Page', required: true, refreshers: ['siteId'], options: async ({ auth, siteId }) => { if (!auth || !siteId) { return { disabled: true, placeholder: 'Please select a site first.', options: [], }; } const authValue = auth as PiecePropValueSchema< typeof microsoftSharePointAuth >; const client = Client.initWithMiddleware({ authProvider: { getAccessToken: () => Promise.resolve(authValue.access_token), }, }); const options: DropdownOption<string>[] = []; let response: PageCollection = await client .api(`/sites/${siteId}/pages?$select=id,title`) .get(); while (response.value.length > 0) { for (const page of response.value as any[]) { options.push({ label: page.title ?? `Page ${page.id}`, value: page.id!, }); } if (response['@odata.nextLink']) { response = await client.api(response['@odata.nextLink']).get(); } else { break; } } return { disabled: false, options, }; }, }), };

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server