Skip to main content
Glama

get_jobs_stats

Retrieve aggregated statistics for agent jobs to monitor performance and track metrics without accessing individual job data. Optimized for dashboards with minimal network overhead.

Instructions

Get aggregated statistics for agent jobs without retrieving individual job data. Optimized for dashboards and monitoring with minimal network overhead.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
org_idNoFilter by organization ID.
scheduled_at_gteNoStart of period (ISO 8601)
scheduled_at_lteNoEnd of period (ISO 8601)
created_at_gteNoFilter for jobs created at or after a specific time (ISO 8601).
created_at_lteNoFilter for jobs created at or before a specific time (ISO 8601).
job_type_idNoJob type filter
channel_codeNoChannel filter
tagsNoTags filter (comma-separated)
statusNoStatus filter

Implementation Reference

  • The main handler function for the 'get_jobs_stats' MCP tool. It logs the tool call, fetches stats via agentJobsClient.getStats, extracts stats and filters from response.meta, formats them into a text response using formatJobStats, logs the response, and handles errors gracefully.
    async (params) => {
      mcpDebugger.toolCall("get_jobs_stats", params);
    
      try {
        const response = await withTiming(
          () => agentJobsClient.getStats(params),
          "get_jobs_stats API call"
        );
    
        const stats = response.meta?.stats || {};
        const filters = response.meta?.filters || {};
    
        mcpDebugger.debug("Raw API response", { stats, filters });
    
        const result = {
          content: [{
            type: "text" as const,
            text: formatJobStats(stats, filters),
          }]
        };
    
        mcpDebugger.toolResponse("get_jobs_stats", result);
        return result;
      } catch (error: any) {
        mcpDebugger.toolError("get_jobs_stats", error);
    
        return {
          content: [{
            type: "text" as const,
            text: `Error getting job stats: ${error.message}`,
          }],
        };
      }
    }
  • Zod-based input schema validation for the 'get_jobs_stats' tool, defining optional filters such as org_id, date ranges (using flexibleDateTimeSchema), job_type_id, channel_code, tags, and status (from jobStatusSchema enum). Includes tool description and annotations.
    const jobStatusSchema = z.enum([
      "waiting",
      "scheduled",
      "running",
      "completed",
      "failed",
      "canceled"
    ]);
    
    export default (server: McpServer) => {
      server.registerTool(
        "get_jobs_stats",
        {
          description: "Get aggregated statistics for agent jobs without retrieving individual job data. Optimized for dashboards and monitoring with minimal network overhead.",
          annotations: {
            title: "Get Job Statistics"
          },
          inputSchema: {
            org_id: z.string().optional().describe("Filter by organization ID."),
            scheduled_at_gte: flexibleDateTimeSchema.optional().describe("Start of period (ISO 8601)"),
            scheduled_at_lte: flexibleDateTimeSchema.optional().describe("End of period (ISO 8601)"),
            created_at_gte: flexibleDateTimeSchema.optional().describe("Filter for jobs created at or after a specific time (ISO 8601)."),
            created_at_lte: flexibleDateTimeSchema.optional().describe("Filter for jobs created at or before a specific time (ISO 8601)."),
            job_type_id: z.string().optional().describe("Job type filter"),
            channel_code: z.string().optional().describe("Channel filter"),
            tags: z.string().optional().describe("Tags filter (comma-separated)"),
            status: jobStatusSchema.optional().describe("Status filter"),
          }
        },
  • The module registration function that attaches the 'get_jobs_stats' tool to the MCP server, specifying the tool name, input schema, and handler function.
    export default (server: McpServer) => {
      server.registerTool(
        "get_jobs_stats",
        {
          description: "Get aggregated statistics for agent jobs without retrieving individual job data. Optimized for dashboards and monitoring with minimal network overhead.",
          annotations: {
            title: "Get Job Statistics"
          },
          inputSchema: {
            org_id: z.string().optional().describe("Filter by organization ID."),
            scheduled_at_gte: flexibleDateTimeSchema.optional().describe("Start of period (ISO 8601)"),
            scheduled_at_lte: flexibleDateTimeSchema.optional().describe("End of period (ISO 8601)"),
            created_at_gte: flexibleDateTimeSchema.optional().describe("Filter for jobs created at or after a specific time (ISO 8601)."),
            created_at_lte: flexibleDateTimeSchema.optional().describe("Filter for jobs created at or before a specific time (ISO 8601)."),
            job_type_id: z.string().optional().describe("Job type filter"),
            channel_code: z.string().optional().describe("Channel filter"),
            tags: z.string().optional().describe("Tags filter (comma-separated)"),
            status: jobStatusSchema.optional().describe("Status filter"),
          }
        },
        async (params) => {
          mcpDebugger.toolCall("get_jobs_stats", params);
    
          try {
            const response = await withTiming(
              () => agentJobsClient.getStats(params),
              "get_jobs_stats API call"
            );
    
            const stats = response.meta?.stats || {};
            const filters = response.meta?.filters || {};
    
            mcpDebugger.debug("Raw API response", { stats, filters });
    
            const result = {
              content: [{
                type: "text" as const,
                text: formatJobStats(stats, filters),
              }]
            };
    
            mcpDebugger.toolResponse("get_jobs_stats", result);
            return result;
          } catch (error: any) {
            mcpDebugger.toolError("get_jobs_stats", error);
    
            return {
              content: [{
                type: "text" as const,
                text: `Error getting job stats: ${error.message}`,
              }],
            };
          }
        }
      );
    }
  • Helper method in AgentJobsClient that prepares parameters for fetching job statistics (adds include='stats' and limit=1) and calls the GET endpoint '/services/agent-jobs'. This is invoked by the tool handler.
    async getStats(filters: Record<string, any> = {}) {
        const params = {
          ...filters,
          include: 'stats',
          limit: 1
        };
    
        return this.get('/services/agent-jobs', params);
      }
Behavior3/5

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

Annotations only provide a title, so the description carries the burden of behavioral disclosure. It adds useful context about optimization for dashboards and minimal network overhead, which hints at performance characteristics. However, it lacks details on rate limits, authentication needs, or specific return format, leaving some behavioral aspects unclear.

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?

The description is two sentences, front-loaded with the core purpose and followed by usage context. Every word earns its place—no redundancy or fluff. It efficiently communicates key information without unnecessary elaboration.

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

Completeness3/5

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

Given the tool's complexity (9 parameters, no output schema, and minimal annotations), the description is adequate but incomplete. It covers purpose and usage well but lacks details on output format, error handling, or behavioral constraints like pagination. For a statistical tool with many filters, more context on result structure would be beneficial.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents all 9 parameters. The description does not add any parameter-specific information beyond what the schema provides, such as explaining how filters combine or default behaviors. This meets the baseline for high schema coverage but doesn't enhance parameter understanding.

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

Purpose5/5

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

The description clearly states the specific action ('Get aggregated statistics') and resource ('agent jobs'), distinguishing it from siblings like 'get_job' (individual job) and 'list_jobs' (individual job data). It explicitly contrasts with retrieving individual job data, making the purpose unambiguous.

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

Usage Guidelines5/5

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

The description provides explicit guidance on when to use this tool ('Optimized for dashboards and monitoring with minimal network overhead') and when not to ('without retrieving individual job data'), with clear alternatives implied (e.g., 'get_job' or 'list_jobs' for individual data). This helps the agent choose appropriately based on the need for aggregated vs. detailed data.

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/aiconnect-cloud/agentjobs-mcp'

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