Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
CLAUDE.md
TODO.md

# Build output
# # Build output
dist/
build/

Expand Down
5 changes: 3 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "google-cloud-mcp",
"version": "0.3.0",
"version": "0.4.0",
"description": "Model Context Protocol server for Google Cloud services",
"type": "module",
"main": "dist/index.js",
Expand All @@ -27,11 +27,12 @@
"iam",
"logging",
"monitoring",
"profiler",
"spanner",
"trace"
],
"author": "Kristof Kowalski <k@ko.wal.ski>",
"license": "MIT",
"license": "Apache",
"dependencies": {
"@google-cloud/iam": "^2.3.0",
"@google-cloud/logging": "^11.2.0",
Expand Down
17 changes: 16 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Google Cloud MCP Server
*
* This server provides Model Context Protocol resources and tools for interacting
* with Google Cloud services (Error Reporting, IAM, Logging, Monitoring, Spanner, and Trace).
* with Google Cloud services (Error Reporting, IAM, Logging, Monitoring, Profiler, Spanner, and Trace).
*/
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import dotenv from "dotenv";
Expand Down Expand Up @@ -30,6 +30,10 @@ import {
registerErrorReportingResources,
registerErrorReportingTools,
} from "./services/error-reporting/index.js";
import {
registerProfilerResources,
registerProfilerTools,
} from "./services/profiler/index.js";
import { registerPrompts } from "./prompts/index.js";
import { initGoogleAuth, authClient } from "./utils/auth.js";
import { registerResourceDiscovery } from "./utils/resource-discovery.js";
Expand Down Expand Up @@ -212,6 +216,17 @@ async function main(): Promise<void> {
);
}

try {
// Register Google Cloud Profiler service
logger.info("Registering Google Cloud Profiler services");
registerProfilerResources(server);
registerProfilerTools(server);
} catch (error) {
logger.warn(
`Error registering Profiler services: ${error instanceof Error ? error.message : String(error)}`,
);
}

try {
// Register additional tools
logger.info("Registering additional tools");
Expand Down
6 changes: 3 additions & 3 deletions src/services/error-reporting/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
export function registerErrorReportingResources(server: McpServer): void {
// Register a resource for recent error analysis
server.resource(
"recent-errors",
"gcp-error-reporting-recent-errors",
new ResourceTemplate("gcp-error-reporting://{projectId}/recent", {
list: undefined,
}),
Expand Down Expand Up @@ -110,7 +110,7 @@ export function registerErrorReportingResources(server: McpServer): void {

// Register a resource for error analysis with custom time range
server.resource(
"error-analysis",
"gcp-error-reporting-error-analysis",
new ResourceTemplate(
"gcp-error-reporting://{projectId}/analysis/{timeRange}",
{ list: undefined },
Expand Down Expand Up @@ -228,7 +228,7 @@ export function registerErrorReportingResources(server: McpServer): void {

// Register a resource for service-specific error analysis
server.resource(
"service-errors",
"gcp-error-reporting-service-errors",
new ResourceTemplate(
"gcp-error-reporting://{projectId}/service/{serviceName}",
{ list: undefined },
Expand Down
6 changes: 3 additions & 3 deletions src/services/error-reporting/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
export function registerErrorReportingTools(server: McpServer): void {
// Tool to list error groups with filtering and time range support
server.tool(
"list-error-groups",
"gcp-error-reporting-list-groups",
{
title: "List Error Groups",
description:
Expand Down Expand Up @@ -178,7 +178,7 @@ export function registerErrorReportingTools(server: McpServer): void {

// Tool to get detailed information about a specific error group
server.tool(
"get-error-group-details",
"gcp-error-reporting-get-group-details",
{
title: "Get Error Group Details",
description:
Expand Down Expand Up @@ -407,7 +407,7 @@ export function registerErrorReportingTools(server: McpServer): void {

// Tool to analyse error trends over time
server.tool(
"analyse-error-trends",
"gcp-error-reporting-analyse-trends",
{
title: "Analyse Error Trends",
description:
Expand Down
4 changes: 2 additions & 2 deletions src/services/iam/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { logger } from "../../utils/logger.js";
export function registerIamResources(server: McpServer): void {
// Register a resource for project IAM policy
server.resource(
"project-iam-policy",
"gcp-iam-project-policy",
new ResourceTemplate("gcp-iam://{projectId}/policy", { list: undefined }),
async (uri, { projectId }) => {
try {
Expand Down Expand Up @@ -75,7 +75,7 @@ export function registerIamResources(server: McpServer): void {

// Register a resource for IAM policy analysis summary
server.resource(
"iam-policy-summary",
"gcp-iam-policy-summary",
new ResourceTemplate("gcp-iam://{projectId}/summary", { list: undefined }),
async (uri, { projectId }) => {
try {
Expand Down
12 changes: 6 additions & 6 deletions src/services/iam/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { logger } from "../../utils/logger.js";
export function registerIamTools(server: McpServer): void {
// Tool to get project-level IAM policy
server.registerTool(
"get-project-iam-policy",
"gcp-iam-get-project-policy",
{
title: "Get Project IAM Policy",
description: "Retrieve the IAM policy for a Google Cloud project",
Expand Down Expand Up @@ -92,7 +92,7 @@ export function registerIamTools(server: McpServer): void {

// Tool to test IAM permissions on a project
server.registerTool(
"test-project-permissions",
"gcp-iam-test-project-permissions",
{
title: "Test Project IAM Permissions",
description:
Expand Down Expand Up @@ -174,7 +174,7 @@ export function registerIamTools(server: McpServer): void {

// Tool to test permissions on specific resources
server.registerTool(
"test-resource-permissions",
"gcp-iam-test-resource-permissions",
{
title: "Test Resource-Specific IAM Permissions",
description:
Expand Down Expand Up @@ -254,7 +254,7 @@ export function registerIamTools(server: McpServer): void {

// Tool to validate deployment permissions for common GCP services
server.registerTool(
"validate-deployment-permissions",
"gcp-iam-validate-deployment-permissions",
{
title: "Validate Deployment Permissions",
description:
Expand Down Expand Up @@ -407,7 +407,7 @@ export function registerIamTools(server: McpServer): void {

// Tool to list all available deployment permission sets
server.registerTool(
"list-deployment-services",
"gcp-iam-list-deployment-services",
{
title: "List Available Deployment Services",
description:
Expand Down Expand Up @@ -467,7 +467,7 @@ export function registerIamTools(server: McpServer): void {

// Tool to analyse permission gaps for a specific resource and operation
server.registerTool(
"analyse-permission-gaps",
"gcp-iam-analyse-permission-gaps",
{
title: "Analyse Permission Gaps",
description:
Expand Down
4 changes: 2 additions & 2 deletions src/services/logging/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { formatLogEntry, getLoggingClient, LogEntry } from "./types.js";
export function registerLoggingResources(server: McpServer): void {
// Register a resource for listing recent logs
server.resource(
"recent-logs",
"gcp-logging-recent-logs",
new ResourceTemplate("gcp-logs://{projectId}/recent", { list: undefined }),
async (uri, { projectId }) => {
try {
Expand Down Expand Up @@ -93,7 +93,7 @@ export function registerLoggingResources(server: McpServer): void {

// Register a resource for querying logs with a filter
server.resource(
"filtered-logs",
"gcp-logging-filtered-logs",
new ResourceTemplate("gcp-logs://{projectId}/filter/{filter}", {
list: undefined,
}),
Expand Down
6 changes: 3 additions & 3 deletions src/services/logging/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { parseRelativeTime } from "../../utils/time.js";
export function registerLoggingTools(server: McpServer): void {
// Tool to query logs with a custom filter
server.registerTool(
"query-logs",
"gcp-logging-query-logs",
{
title: "Query Logs",
description:
Expand Down Expand Up @@ -99,7 +99,7 @@ Please check your filter syntax and try again. For filter syntax help, see: http

// Tool to get logs for a specific time range
server.registerTool(
"logs-time-range",
"gcp-logging-query-time-range",
{
title: "Query Logs by Time Range",
description:
Expand Down Expand Up @@ -199,7 +199,7 @@ Please check your time range format and try again. Valid formats include:

// Advanced tool for searching across all payload types and fields
server.registerTool(
"search-logs-comprehensive",
"gcp-logging-search-comprehensive",
{
title: "Comprehensive Log Search",
description:
Expand Down
4 changes: 2 additions & 2 deletions src/services/monitoring/resources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import { formatTimeSeriesData, getMonitoringClient } from "./types.js";
export function registerMonitoringResources(server: McpServer): void {
// Register a resource for recent metrics
server.resource(
"recent-metrics",
"gcp-monitoring-recent-metrics",
new ResourceTemplate("gcp-monitoring://{projectId}/recent", {
list: undefined,
}),
Expand Down Expand Up @@ -83,7 +83,7 @@ export function registerMonitoringResources(server: McpServer): void {

// Register a resource for metrics with a custom filter
server.resource(
"filtered-metrics",
"gcp-monitoring-filtered-metrics",
new ResourceTemplate("gcp-monitoring://{projectId}/filter/{filter}", {
list: undefined,
}),
Expand Down
6 changes: 3 additions & 3 deletions src/services/monitoring/tools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ export async function registerMonitoringTools(
}
// Tool to query metrics with a custom filter and time range
server.tool(
"query-metrics",
"gcp-monitoring-query-metrics",
{
filter: z.string().describe("The filter to apply to metrics"),
startTime: z
Expand Down Expand Up @@ -138,7 +138,7 @@ export async function registerMonitoringTools(

// Tool to list available metric types
server.tool(
"list-metric-types",
"gcp-monitoring-list-metric-types",
{
filter: z
.string()
Expand Down Expand Up @@ -314,7 +314,7 @@ export async function registerMonitoringTools(

// Tool to query metrics using natural language
server.tool(
"natural-language-metrics-query",
"gcp-monitoring-query-natural-language",
{
query: z
.string()
Expand Down
6 changes: 6 additions & 0 deletions src/services/profiler/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/**
* Google Cloud Profiler service exports
*/
export { registerProfilerTools } from "./tools.js";
export { registerProfilerResources } from "./resources.js";
export * from "./types.js";
Loading