Skip to main content
Glama

mcp-google-sheets

index.ts6.68 kB
import { AuthenticationType, HttpMethod, HttpRequest, httpClient, } from '@activepieces/pieces-common'; import { DynamicPropsValue, PiecePropValueSchema, Property, } from '@activepieces/pieces-framework'; import { dynamicsCRMAuth, getBaseUrl } from '../../'; import { DynamicsCRMClient } from './client'; import { EntityAttributeType } from './constants'; export function makeClient(auth: PiecePropValueSchema<typeof dynamicsCRMAuth>) { const client = new DynamicsCRMClient( auth.props?.['hostUrl'], auth.access_token, auth.props?.['proxyUrl'] ); return client; } export const DynamicsCRMCommon = { entityType: (description: string) => Property.Dropdown({ displayName: 'Entity Type', refreshers: [], description, required: true, options: async ({ auth }) => { if (!auth) { return { disabled: true, options: [], placeholder: '', }; } const client = makeClient( auth as PiecePropValueSchema<typeof dynamicsCRMAuth> ); const res = await client.fetchEntityTypes(); return { disabled: false, options: res.value.map((val) => { return { label: val.EntitySetName, value: val.EntitySetName, }; }), }; }, }), recordId: Property.Dropdown({ displayName: 'Record ID', refreshers: ['entityType'], required: true, options: async ({ auth, entityType }) => { if (!auth || !entityType) { return { disabled: true, options: [], placeholder: 'Please select entity type first.', }; } const client = makeClient( auth as PiecePropValueSchema<typeof dynamicsCRMAuth> ); const res = await client.fetchEntityTypeAttributes(entityType as string); if (!res.value[0]) { return { disabled: true, options: [], placeholder: 'Please select entity type first.', }; } const entityUrlPath = entityType as string; const entityPrimaryKey = res.value[0].PrimaryIdAttribute; const entityprimaryNameAttribute = res.value[0].PrimaryNameAttribute; const authValue = auth as PiecePropValueSchema<typeof dynamicsCRMAuth>; type Response = { '@odata.context': string; value: Array<{ [K in | typeof entityprimaryNameAttribute | typeof entityPrimaryKey]: string; }>; }; const request: HttpRequest = { method: HttpMethod.GET, url: `${getBaseUrl( authValue.props?.['hostUrl'], authValue.props?.['proxyUrl'] )}/api/data/v9.2/${entityUrlPath}`, queryParams: { $select: entityprimaryNameAttribute, }, authentication: { type: AuthenticationType.BEARER_TOKEN, token: authValue.access_token, }, headers: { Accept: 'application/json', 'OData-MaxVersion': '4.0', 'OData-Version': '4.0', 'Content-Type': 'application/json', }, }; const { body } = await httpClient.sendRequest<Response>(request); return { disabled: false, options: body.value.map((val) => { return { label: val[entityprimaryNameAttribute] ?? val[entityPrimaryKey], value: val[entityPrimaryKey], }; }), }; }, }), entityFields: (isCreate = true) => Property.DynamicProperties({ displayName: 'Entity Fields', refreshers: ['auth', 'entityType'], required: true, props: async ({ auth, entityType }) => { if (!auth) return {}; if (!entityType) return {}; const fields: DynamicPropsValue = {}; const client = makeClient( auth as PiecePropValueSchema<typeof dynamicsCRMAuth> ); const typeRes = await client.fetchEntityTypeAttributes( entityType as unknown as string ); if (!typeRes.value[0]) { return { disabled: true, options: [], placeholder: 'Please select entity type first.', }; } const res = await client.fetchEntityAttributes( typeRes.value[0].LogicalName ); for (const field of res.value) { if ( field.IsValidForCreate && ![ EntityAttributeType.ENTITY_NAME, EntityAttributeType.LOOKUP, EntityAttributeType.MEMO, EntityAttributeType.MONEY, EntityAttributeType.OWNER, EntityAttributeType.VIRTUAL, EntityAttributeType.UNIQUE_IDENTIFIER, ].includes(field.AttributeType) ) { const params = { displayName: field.DisplayName?.UserLocalizedLabel?.Label ?? field.LogicalName, description: field.Description?.UserLocalizedLabel?.Label ?? '', required: field.IsPrimaryName && isCreate, }; switch (field.AttributeType) { case EntityAttributeType.BIGINT: case EntityAttributeType.DECIMAL: case EntityAttributeType.DOUBLE: case EntityAttributeType.INTEGER: fields[field.LogicalName] = Property.Number(params); break; case EntityAttributeType.DATETIME: fields[field.LogicalName] = Property.DateTime(params); break; case EntityAttributeType.BOOLEAN: fields[field.LogicalName] = Property.Checkbox(params); break; case EntityAttributeType.STRING: fields[field.LogicalName] = Property.ShortText(params); break; case EntityAttributeType.PICKLIST: case EntityAttributeType.STATE: case EntityAttributeType.STATUS: { const options = await client.fetchOptionFieldValues( typeRes.value[0].LogicalName, field.LogicalName, field.AttributeType ); fields[field.LogicalName] = Property.StaticDropdown({ ...params, options: { disabled: false, options: options, }, }); break; } default: break; } } } return fields; }, }), };

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