marketo_approve_form
Approve Marketo forms by submitting a form ID and optional comment to finalize form changes for deployment.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| formId | Yes | ||
| comment | No |
Implementation Reference
- src/index.ts:97-115 (handler)The main handler function for the 'marketo_approve_form' tool. It takes formId and optional comment, makes a POST request to the Marketo API to approve the form, and returns the response or error.async ({ formId, comment }) => { try { const response = await makeApiRequest( `/asset/v1/form/${formId}/approve.json`, 'POST', comment ? { comment } : undefined ); 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:93-96 (schema)Zod input schema defining parameters for the tool: required formId (number) and optional comment (string).{ formId: z.number(), comment: z.string().optional(), },
- src/index.ts:91-116 (registration)The registration of the 'marketo_approve_form' tool on the MCP server using server.tool(name, inputSchema, handler).server.tool( 'marketo_approve_form', { formId: z.number(), comment: z.string().optional(), }, async ({ formId, comment }) => { try { const response = await makeApiRequest( `/asset/v1/form/${formId}/approve.json`, 'POST', comment ? { comment } : undefined ); 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 used by the tool handler to perform authenticated HTTP requests to the Marketo API.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 that handles OAuth token acquisition and caching for Marketo API authentication, used by makeApiRequest.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'); } } }