Skip to main content
Glama
alexleventer

Marketo MCP Server

by alexleventer

marketo_get_lead_by_id

Retrieve a lead record using its Marketo ID. Optionally specify fields to return for customized data.

Instructions

Retrieve a lead by its numeric Marketo ID. Optionally specify which fields to return (defaults to standard fields). Returns lead record with all requested field values.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
leadIdYes
fieldsNo

Implementation Reference

  • src/index.ts:254-267 (registration)
    Registration of the 'marketo_get_lead_by_id' tool using server.tool() on the McpServer instance.
    server.tool(
      'marketo_get_lead_by_id',
      'Retrieve a lead by its numeric Marketo ID. Optionally specify which fields to return (defaults to standard fields). Returns lead record with all requested field values.',
      {
        leadId: z.number(),
        fields: z.array(z.string()).optional(),
      },
      tool(async ({ leadId, fields }) => {
        const params = new URLSearchParams();
        if (fields) params.append('fields', fields.join(','));
        const query = params.toString() ? `?${params.toString()}` : '';
        return makeApiRequest(`/rest/v1/lead/${leadId}.json${query}`, 'GET');
      })
    );
  • Input schema for 'marketo_get_lead_by_id': leadId (required number) and fields (optional array of strings).
    {
      leadId: z.number(),
      fields: z.array(z.string()).optional(),
    },
  • Handler function that constructs a Marketo REST API GET request to /rest/v1/lead/{leadId}.json with optional fields query parameter.
    tool(async ({ leadId, fields }) => {
      const params = new URLSearchParams();
      if (fields) params.append('fields', fields.join(','));
      const query = params.toString() ? `?${params.toString()}` : '';
      return makeApiRequest(`/rest/v1/lead/${leadId}.json${query}`, 'GET');
    })
  • The makeApiRequest helper function that executes the actual HTTP call to Marketo's API with Bearer token authentication.
    async function makeApiRequest(
      endpoint: string,
      method: string,
      data?: any,
      contentType: string = 'application/json'
    ) {
      const token = await tokenManager.getToken();
      const headers: Record<string, string> = {
        Authorization: `Bearer ${token}`,
      };
    
      if (contentType) {
        headers['Content-Type'] = contentType;
      }
    
      try {
        const response = await axios({
          url: `${MARKETO_BASE_URL}${endpoint}`,
          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;
      }
    }
  • The 'tool' wrapper helper that handles formatting responses and error handling for all tool handlers.
    function tool<T>(handler: (args: T) => Promise<unknown>) {
      return async (args: T) => {
        try {
          const response = await handler(args);
          return {
            content: [{ type: 'text' as const, text: JSON.stringify(response, null, 2) }],
          };
        } catch (error: any) {
          return {
            content: [
              {
                type: 'text' as const,
                text: `Error: ${error.response?.data?.message || error.message}`,
              },
            ],
            isError: true,
          };
        }
      };
    }
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It indicates a read operation ('Retrieve') but does not explicitly state that the tool is read-only or disclose any side effects, permissions, or error handling. Lacks transparency beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no extraneous information. Front-loaded with the primary purpose, and the second sentence adds relevant detail about parameter usage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simplicity of the tool (single lead retrieval with optional fields) and no output schema, the description covers the essential purpose and parameter semantics. Could be improved by mentioning response format or error behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description adds meaning: it clarifies that 'fields' is optional and defaults to standard fields. This compensates for the lack of schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (retrieve), resource (lead by numeric Marketo ID), and the optional fields feature. It is specific but does not explicitly differentiate from sibling tools like marketo_get_lead_by_email or marketo_get_lead_activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_lead_by_email). No mention of prerequisites or conditions that would make this tool inappropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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