Skip to main content
Glama

gcp_run_logs

Read-onlyIdempotent

Retrieve and filter Cloud Run service logs from Google Cloud Platform. View deployment, service, and runtime logs with severity filtering and time range options.

Instructions

Cloud Run 로그|배포 로그|서비스 로그|run logs - Cloud Run 서비스 로그를 조회합니다

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
serviceYesCloud Run 서비스 이름
regionNo리전 (예: asia-northeast3). 기본: gcloud 설정값
project_idNoGCP 프로젝트 ID (기본: 현재 설정된 프로젝트)
severityNo로그 레벨 필터. 기본: ALLALL
time_rangeNo시간 범위 (예: "1h", "6h", "24h", "7d"). 기본: "1h"1h
limitNo최대 로그 수 (기본: 50, 최대: 500)
formatNo출력 형식 (기본: text)text

Implementation Reference

  • Main execution logic for the gcp_run_logs tool: builds log filter for Cloud Run service, executes gcloud logging read, parses and formats logs, generates error reports.
    export async function gcpRunLogs(args: GcpRunLogsArgs) {
      try {
        const projectId = await getProjectId(args.project_id);
        const timeRange = args.time_range || '1h';
        const limit = Math.min(args.limit || 50, 500);
        const timestamp = parseTimeRange(timeRange);
    
        // Build filter for Cloud Run logs
        let filter = `resource.type="cloud_run_revision" AND resource.labels.service_name="${args.service}" AND timestamp>="${timestamp}"`;
    
        if (args.severity && args.severity !== 'ALL') {
          filter += ` AND severity="${args.severity}"`;
        }
    
        if (args.region) {
          filter += ` AND resource.labels.location="${args.region}"`;
        }
    
        // Execute gcloud logging read
        const command = `logging read '${filter}' --project=${projectId} --limit=${limit} --format=json`;
        const result = await executeGcloud(command, 60000);
    
        // Parse JSON output
        let logs: any[] = [];
        try {
          logs = JSON.parse(result.stdout || '[]');
        } catch {
          logs = [];
        }
    
        // Transform to LogEntry format
        const logEntries: LogEntry[] = logs.map((log: any) => ({
          timestamp: log.timestamp || log.receiveTimestamp || '',
          severity: log.severity || 'DEFAULT',
          message: log.textPayload || log.jsonPayload?.message || JSON.stringify(log.jsonPayload || {}),
          resource: log.resource?.labels?.revision_name,
          labels: log.labels,
        }));
    
        // Create error report
        const errorReport = createErrorReport(logEntries);
    
        if (args.format === 'json') {
          return {
            content: [
              {
                type: 'text',
                text: JSON.stringify({
                  project: projectId,
                  service: args.service,
                  region: args.region,
                  timeRange,
                  totalLogs: logEntries.length,
                  ...errorReport,
                  logs: logEntries,
                }, null, 2),
              },
            ],
          };
        }
    
        // Format text output
        const header = `📋 Cloud Run 로그: ${args.service}\n프로젝트: ${projectId}\n시간 범위: ${timeRange}\n총 ${logEntries.length}개 로그\n`;
        const formattedLogs = formatLogEntries(logEntries);
    
        // 에러가 있으면 상세 리포트 + 배포 실패 힌트, 없으면 기본 요약
        let reportSection: string;
        if (errorReport.hasErrors) {
          reportSection = createDetailedErrorReport(logEntries);
          // Cloud Run 특화 힌트 추가 (배포 실패 가능성)
          reportSection += '\n' + getHiAiIntegrationHint('deployment_failure');
        } else {
          reportSection = errorReport.summary;
        }
    
        return {
          content: [
            {
              type: 'text',
              text: `${header}\n${reportSection}\n\n${formattedLogs}`,
            },
          ],
        };
      } catch (error: any) {
        return {
          content: [
            {
              type: 'text',
              text: formatError(error),
            },
          ],
          isError: true,
        };
      }
    }
  • Tool schema definition for gcp_run_logs, including name, description, annotations, and detailed inputSchema with properties like service, region, severity, etc.
    export const gcpRunLogsDefinition = {
      name: 'gcp_run_logs',
      description: 'Cloud Run 로그|배포 로그|서비스 로그|run logs - Cloud Run 서비스 로그를 조회합니다',
      annotations: {
        title: 'Cloud Run 로그 조회',
        readOnlyHint: true,
        destructiveHint: false,
        idempotentHint: true,
        openWorldHint: true,
      },
      inputSchema: {
        type: 'object' as const,
        properties: {
          service: {
            type: 'string',
            description: 'Cloud Run 서비스 이름',
          },
          region: {
            type: 'string',
            description: '리전 (예: asia-northeast3). 기본: gcloud 설정값',
          },
          project_id: {
            type: 'string',
            description: 'GCP 프로젝트 ID (기본: 현재 설정된 프로젝트)',
          },
          severity: {
            type: 'string',
            enum: ['ERROR', 'WARNING', 'INFO', 'DEBUG', 'ALL'],
            description: '로그 레벨 필터. 기본: ALL',
            default: 'ALL',
          },
          time_range: {
            type: 'string',
            description: '시간 범위 (예: "1h", "6h", "24h", "7d"). 기본: "1h"',
            default: '1h',
          },
          limit: {
            type: 'number',
            description: '최대 로그 수 (기본: 50, 최대: 500)',
            default: 50,
          },
          format: {
            type: 'string',
            enum: ['text', 'json'],
            description: '출력 형식 (기본: text)',
            default: 'text',
          },
        },
        required: ['service'],
      },
    };
  • src/index.ts:77-89 (registration)
    Registration of gcpRunLogsDefinition in the tools array, which is returned by the ListToolsRequestSchema handler.
    const tools = [
      gcpSetupDefinition,
      gcpLogsReadDefinition,
      gcpRunStatusDefinition,
      gcpRunLogsDefinition,
      gcpSqlQueryDefinition,
      gcpSqlProxyDefinition,
      gcpStorageListDefinition,
      gcpSecretListDefinition,
      gcpAuthStatusDefinition,
      gcpServicesListDefinition,
      gcpBillingInfoDefinition,
    ];
  • src/index.ts:219-220 (registration)
    Tool dispatcher in CallToolRequestSchema handler that routes calls to the gcpRunLogs function.
    case 'gcp_run_logs':
      return await gcpRunLogs(args as any) as CallToolResult;
  • TypeScript interface matching the input schema for type safety in the handler.
    interface GcpRunLogsArgs {
      service: string;
      region?: string;
      project_id?: string;
      severity?: 'ERROR' | 'WARNING' | 'INFO' | 'DEBUG' | 'ALL';
      time_range?: string;
      limit?: number;
      format?: 'text' | 'json';
    }
Behavior3/5

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

Annotations provide readOnlyHint=true, destructiveHint=false, openWorldHint=true, and idempotentHint=true, covering safety and idempotency. The description adds minimal behavioral context beyond this, such as the type of logs (service logs) and synonyms (배포 로그, run logs), but doesn't disclose rate limits, authentication needs, or detailed output behavior. With annotations doing heavy lifting, the description adds some value but not rich behavioral details.

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

Conciseness4/5

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

The description is concise and front-loaded, with the core purpose stated clearly in a single sentence after synonyms. It avoids unnecessary verbosity, but the list of synonyms ('Cloud Run 로그|배포 로그|서비스 로그|run logs') could be slightly redundant. Overall, it's efficient with minimal waste.

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 (7 parameters, no output schema) and rich annotations, the description is adequate but has gaps. It clearly states the purpose but lacks usage guidelines, output details (since no output schema), and deeper behavioral context. Annotations cover safety, but the description doesn't fully compensate for missing output information or sibling differentiation, making it minimally viable.

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%, with all parameters well-documented in the input schema (e.g., service name, region, severity levels, time range formats). The description adds no additional parameter semantics beyond what's in the schema, such as explaining interactions between parameters or usage examples. Baseline score of 3 is appropriate since the schema fully covers parameter details.

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 tool's purpose: 'Cloud Run 서비스 로그를 조회합니다' (retrieves Cloud Run service logs). It specifies the verb '조회합니다' (retrieve) and resource 'Cloud Run 서비스 로그' (Cloud Run service logs), making the purpose unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'gcp_logs_read' or 'gcp_run_status', which could be related logging or status tools.

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?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'gcp_logs_read' (which might be a general logs tool) or 'gcp_run_status' (which might provide service status), leaving the agent with no context for tool selection. Usage is implied only by the purpose statement, with no explicit when/when-not instructions or prerequisites.

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/su-record/hi-gcloud'

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