@turbot/guardrails-mcp
Version:
MCP server for interacting with Turbot Guardrails.
111 lines (110 loc) • 4.01 kB
JavaScript
import { executeQuery } from "../utils/graphqlClient.js";
import { logger } from '../services/pinoLogger.js';
import { formatJsonToolResponse, errorResponse } from '../utils/responseFormatter.mjs';
import { addFiltersWithDefaultLimit } from '../utils/filterUtils.js';
/*
description: "Discover, search and filter resources in Turbot Guardrails.",
inputSchema: {
type: "object",
properties: {
filter: {
type: "string",
description: `Search or filter query. For example:
- title: "my server"
- exact resource type: "resourceTypeId:tmod:@turbot/aws-ec2#/resource/types/instance"
- resource type: "resourceType:s3"
- tags: "tags:env=dev"
- last modified: "timestamp:>T-15m"
- scoped in hierarchy: "resource:'arn:aws:::111122223333'"
- multiple filters: "my server tags:env=dev"
- sort: "sort:title" or "sort:-title" (descending)
- limit: "limit:10" (default: 5000)`
*/
export const tool = {
name: "guardrails_control_list",
description: "Discover, search and filter controls in Turbot Guardrails.",
inputSchema: {
type: "object",
properties: {
filter: {
type: "string",
description: `Search or filter query. For example:
- state: "state:alarm,error", "state:muted"
- exact control type: "controlTypeId:tmod:@turbot/aws-s3#/control/types/bucketEncryption"
- control type: "controlType:s3"
- resource: "resourceId:176097085664591"
- exact resource type: "resourceTypeId:tmod:@turbot/aws-s3#/resource/types/bucket"
- resource type: "resourceType:bucket"
- creation time: "createTimestamp:>T-7d"
- state last changed: "stateChangeTimestamp:>T-7d"
- scoped in hierarchy: "resource:'arn:aws:::111122223333'"
- multiple filters: "state:alarm resourceType:s3"
- sort: "sort:title" or "sort:-title" (descending)
- limit: "limit:10" (default: 5000)`
}
},
additionalProperties: false
},
handler: async ({ filter }) => {
logger.info("Starting list_guardrails_controls tool execution");
try {
// Build array of filters
const filters = [];
addFiltersWithDefaultLimit(filters, filter);
const query = `
query ListControls($filters: [String!]!) {
controls(filter: $filters) {
items {
state
reason
turbot {
id
stateChangeTimestamp
}
type {
uri
trunk {
title
}
}
resource {
trunk {
title
}
turbot {
id
}
}
}
}
}
`;
logger.debug("Executing GraphQL query with filters:", filters);
const result = JSON.parse(await executeQuery(query, { filters }));
logger.debug("Query executed successfully");
// Transform the response to flatten and reorganize fields
const transformedResult = result.controls.items.map(item => ({
id: item.turbot.id,
state: item.state,
reason: item.reason,
stateChangeTimestamp: item.turbot.stateChangeTimestamp,
type: {
uri: item.type.uri,
title: item.type.trunk.title
},
resource: {
id: item.resource.turbot.id,
title: item.resource.trunk?.title || null
}
}));
return formatJsonToolResponse(transformedResult);
}
catch (error) {
logger.error("Error in list_guardrails_controls:", error);
const errorMessage = error instanceof Error ?
`${error.name}: ${error.message}` :
String(error);
return errorResponse(`Error listing controls: ${errorMessage}`);
}
}
};