Skip to main content
Glama

marketo_approve_form

Approve Marketo forms by submitting a form ID and optional comment to finalize form changes for deployment.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
formIdYes
commentNo

Implementation Reference

  • 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}` }, ], }; } }
  • 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}` }, ], }; } } );
  • 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; } }
  • 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'); } } }

Latest Blog Posts

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/alexleventer/marketo-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server