Skip to main content
Glama

mcp-google-sheets

client.ts2.31 kB
import { AuthenticationType, httpClient, HttpMessageBody, HttpMethod, HttpRequest, QueryParams, } from '@activepieces/pieces-common'; import crypto from 'crypto'; export const BASE_URL = 'https://api.attio.com/v2'; export type AttioApiCallParams = { accessToken: string; method: HttpMethod; resourceUri: string; query?: Record<string, string | number | string[] | undefined>; body?: any; }; export async function attioApiCall<T extends HttpMessageBody>({ accessToken, method, resourceUri, query, body, }: AttioApiCallParams): Promise<T> { const qs: QueryParams = {}; if (query) { for (const [key, value] of Object.entries(query)) { if (value !== null && value !== undefined) { qs[key] = String(value); } } } const request: HttpRequest = { method, url: BASE_URL + resourceUri, authentication: { type: AuthenticationType.BEARER_TOKEN, token: accessToken, }, queryParams: qs, body, }; const response = await httpClient.sendRequest<T>(request); return response.body; } export async function attioPaginatedApiCall<T extends HttpMessageBody>({ accessToken, method, resourceUri, query, body, }: AttioApiCallParams): Promise<T[]> { const limit = 500; let offset = 0; const resultData: T[] = []; let hasMoreItems = true; do { const qs = { ...(query || {}), limit, offset, }; const response = await attioApiCall<{ data: T[] }>({ accessToken, method, resourceUri, query: qs, body, }); if (!response?.data || response.data.length === 0) { break; } resultData.push(...response.data); // If fewer than 'limit' items returned, we've reached the last page hasMoreItems = response.data.length === limit; offset += limit; } while (hasMoreItems); return resultData; } export function verifyWebhookSignature( webhookSecret?: string, webhookSignatureHeader?: string, webhookRawBody?: any, ): boolean { if (!webhookSecret || !webhookSignatureHeader || !webhookRawBody) { return false; } try { const hmac = crypto.createHmac('sha256', webhookSecret); hmac.update(webhookRawBody); const expectedSignature = hmac.digest('hex'); return crypto.timingSafeEqual( Buffer.from(webhookSignatureHeader, 'hex'), Buffer.from(expectedSignature, 'hex'), ); } catch (error) { return false; } }

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