marketo_get_form_by_id
Retrieve a specific Marketo form by its ID to access form details, fields, and configuration for integration or management purposes.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes |
Implementation Reference
- src/index.ts:163-177 (handler)The core handler function for the 'marketo_get_form_by_id' tool. It takes a formId parameter, makes a GET request to the Marketo Asset API endpoint `/asset/v1/form/${formId}.json` using the shared makeApiRequest helper, formats the response as JSON text content, and handles errors by returning an error message.async ({ formId }) => { try { const response = await makeApiRequest(`/asset/v1/form/${formId}.json`, 'GET'); return { content: [{ type: 'text', text: JSON.stringify(response, null, 2) }], }; } catch (error: any) { return { content: [ { type: 'text', text: `Error: ${error.response?.data?.message || error.message}` }, ], }; } }
- src/index.ts:160-162 (schema)Zod input schema for the tool, defining 'formId' as a required number.{ formId: z.number(), },
- src/index.ts:158-178 (registration)Registration of the MCP tool 'marketo_get_form_by_id' via server.tool(), specifying the input schema and handler function.server.tool( 'marketo_get_form_by_id', { formId: z.number(), }, async ({ formId }) => { try { const response = await makeApiRequest(`/asset/v1/form/${formId}.json`, 'GET'); return { content: [{ type: 'text', text: JSON.stringify(response, null, 2) }], }; } catch (error: any) { return { content: [ { type: 'text', text: `Error: ${error.response?.data?.message || error.message}` }, ], }; } } );
- src/index.ts:22-52 (helper)Shared helper function to make authenticated API requests to Marketo endpoints using axios, obtaining Bearer token from TokenManager, handling different content types, and propagating errors.async function makeApiRequest( endpoint: string, method: string, data?: any, contentType: string = 'application/json' ) { const token = await tokenManager.getToken(); const headers: any = { Authorization: `Bearer ${token}`, }; if (contentType) { headers['Content-Type'] = contentType; } try { const response = await axios({ url: `${MARKETO_BASE_URL}${endpoint}`, method: method, data: contentType === 'application/x-www-form-urlencoded' ? new URLSearchParams(data).toString() : data, headers, }); return response.data; } catch (error: any) { console.error('API request failed:', error.response?.data || error.message); throw error; } }
- src/auth.ts:11-52 (helper)TokenManager class provides token management for Marketo OAuth2 client credentials flow. Caches access token with expiry check and refreshes via /identity/oauth/token endpoint when needed. Used by makeApiRequest for authentication.class TokenManager { private clientId: string; private clientSecret: string; private accessToken: string | null = null; private tokenExpiry: number = 0; constructor(clientId: string, clientSecret: string) { this.clientId = clientId; this.clientSecret = clientSecret; } async getToken(): Promise<string> { // Check if we have a valid token if (this.accessToken && Date.now() < this.tokenExpiry) { return this.accessToken; } try { // Extract the identity URL from the base URL // Convert from https://instance.mktorest.com/rest to https://instance.mktorest.com/identity const identityUrl = MARKETO_BASE_URL.replace('/rest', '/identity'); const response = await axios.get(`${identityUrl}/oauth/token`, { params: { grant_type: 'client_credentials', client_id: this.clientId, client_secret: this.clientSecret, }, }); const data = response.data as TokenResponse; this.accessToken = data.access_token; // Set expiry to slightly before the actual expiry to ensure we don't use an expired token this.tokenExpiry = Date.now() + (data.expires_in - 60) * 1000; return this.accessToken; } catch (error: any) { console.error('Failed to get Marketo access token:', error.response?.data || error.message); throw new Error('Failed to authenticate with Marketo'); } } }