Skip to main content
Glama

mcp-google-sheets

client.ts2.61 kB
import { httpClient, HttpMessageBody, HttpMethod, HttpRequest, QueryParams, } from '@activepieces/pieces-common'; export const BASE_URL = 'https://api.airtop.ai/api/v1'; export type AirtopApiCallParams = { apiKey: string; method: HttpMethod; resourceUri: string; query?: Record<string, string | number | string[] | undefined>; body?: any; }; export type AirtopApiResponse<T = any> = { data?: T; message?: string; error?: string; statusCode?: number; }; export type AirtopSession = { id: string; status: 'active' | 'inactive' | 'terminated' | 'expired'; createdAt?: string; configuration?: any; }; export type AirtopWindow = { windowId: string; targetId: string; status?: string; url?: string; }; export type AirtopFile = { id: string; fileName: string; fileType: string; size?: number; createdAt?: string; }; export async function airtopApiCall<T extends HttpMessageBody>({ apiKey, method, resourceUri, query, body, }: AirtopApiCallParams): 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, headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json', 'User-Agent': 'Activepieces-Airtop-Integration', }, queryParams: qs, body, }; try { const response = await httpClient.sendRequest<T>(request); return response.body; } catch (error: any) { if (error.response?.status === 401 || error.response?.status === 403) { throw new Error('Authentication failed. Please check your API key.'); } if (error.response?.status === 429) { throw new Error('Rate limit exceeded. Please wait a moment and try again.'); } if (error.response?.status >= 400 && error.response?.status < 500) { throw new Error(`Request failed: ${error.response?.body?.message || error.message}`); } throw error; } } export function extractApiData<T>(response: any, fallback: T[] = []): T[] { if (!response) return fallback; // Handle different response structures if (Array.isArray(response)) return response; if (response.data && Array.isArray(response.data)) return response.data; if (response.data?.sessions && Array.isArray(response.data.sessions)) return response.data.sessions; if (response.data?.windows && Array.isArray(response.data.windows)) return response.data.windows; if (response.data?.files && Array.isArray(response.data.files)) return response.data.files; return fallback; }

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