Skip to main content
Glama

mcp-google-sheets

props.ts5.25 kB
import { Property, DynamicPropsValue } from '@activepieces/pieces-framework'; import { HttpMethod } from '@activepieces/pieces-common'; import { knackApiCall, KnackAuthProps } from './client'; interface KnackObject { key: string; name: string; } export interface KnackGetObjectResponse { object: { fields: { type: string; key: string; name: string; format: { type: string; options: string[]; }; }[]; }; } export const objectDropdown = Property.Dropdown({ displayName: 'Object', required: true, refreshers: [], options: async ({ auth }) => { if (!auth) { return { disabled: true, placeholder: 'Please authenticate first.', options: [], }; } const typedAuth = auth as KnackAuthProps; try { const response = await knackApiCall<{ objects: KnackObject[] }>({ method: HttpMethod.GET, auth: typedAuth, resourceUri: '/objects', }); return { disabled: false, options: response.objects.map((object) => ({ label: object.name, value: object.key, })), }; } catch (error: any) { return { disabled: true, placeholder: `Error loading objects: ${error.message}`, options: [], }; } }, }); export const fieldIdDropdown = Property.Dropdown({ displayName: 'Field ID', required: true, description:'Field to find the record by', refreshers: ['object'], options: async ({ auth, object }) => { if (!auth || !object) { return { disabled: true, placeholder: 'Please select an object first.', options: [], }; } const typedAuth = auth as KnackAuthProps; try { const response = await knackApiCall<KnackGetObjectResponse>({ method: HttpMethod.GET, auth: typedAuth, resourceUri: `/objects/${object}`, }); return { disabled: false, options: response.object.fields.map((field) => ({ label: field.name, value: field.key, })), }; } catch (error: any) { return { disabled: true, placeholder: `Error loading objects: ${error.message}`, options: [], }; } }, }); export const recordFields = Property.DynamicProperties({ displayName: 'Record Fields', refreshers: ['object'], required: true, props: async ({ auth, object }) => { if (!auth || !object) { return {}; } const props: DynamicPropsValue = {}; const typedAuth = auth as KnackAuthProps; const response = await knackApiCall<KnackGetObjectResponse>({ method: HttpMethod.GET, auth: typedAuth, resourceUri: `/objects/${object}`, }); for (const field of response.object.fields) { switch (field.type) { case 'short_text': case 'email': case 'phone': case 'link': props[field.key] = Property.ShortText({ displayName: field.name, required: false, }); break; case 'paragraph_text': case 'address': case 'rich_text': props[field.key] = Property.LongText({ displayName: field.name, required: false, }); break; case 'number': case 'rating': case 'currency': props[field.key] = Property.Number({ displayName: field.name, required: false, }); break; case 'multiple_choice': { const options = field.format.options.map((option) => ({ label: option, value: option, })); props[field.key] = field.format.type === 'multi' ? Property.StaticMultiSelectDropdown({ displayName: field.name, required: false, options: { options, }, }) : Property.StaticDropdown({ displayName: field.name, required: false, options: { options }, }); break; } case 'boolean': props[field.key] = Property.Checkbox({ displayName: field.name, required: false, }); break; } } return props; }, }); export function knackTransformFields( objectDetails: KnackGetObjectResponse, recordFields: Record<string, any> ): Record<string, any> { const fields = objectDetails.object.fields; const keyToNameMap: Record<string, string> = {}; for (const field of fields) { if (field && field.key && field.name) { keyToNameMap[field.key] = field.name; } } const transformed: Record<string, any> = {}; for (const [key, value] of Object.entries(recordFields)) { const isRaw = key.endsWith('_raw'); const baseKey = isRaw ? key.slice(0, -4) : key; const fieldName = keyToNameMap[baseKey]; if (fieldName) { const transformedKey = isRaw ? `${fieldName} raw` : fieldName; transformed[transformedKey] = value; } else { transformed[key] = value; } } return transformed; }

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