@turbot/guardrails-mcp
Version:
MCP server for interacting with Turbot Guardrails.
74 lines (73 loc) • 2.75 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';
export const tool = {
name: "guardrails_resource_list",
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"
- creation time: "createTimestamp:>T-7d"
- last modified: "timestamp:>T-15m"
- field match: "$.Versioning.Status:Enabled"
- field comparison: "$.Size:<=30"
- IP within CIDR: "$.IpAddress:192.168.1.0/24"
- 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)`
}
},
additionalProperties: false
},
handler: async ({ filter }) => {
logger.info("Starting list_guardrails_resources tool execution");
try {
// Build array of filters
const filters = [];
addFiltersWithDefaultLimit(filters, filter);
const query = `
query ListResources($filters: [String!]!) {
resources(filter: $filters) {
items {
trunk {
title
}
turbot {
id
}
type {
uri
}
}
}
}
`;
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.resources.items.map(item => ({
id: item.turbot.id,
trunkTitle: item.trunk?.title || null,
typeUri: item.type.uri
}));
return formatJsonToolResponse(transformedResult);
}
catch (error) {
logger.error("Error in list_guardrails_resources:", error);
const errorMessage = error instanceof Error ?
`${error.name}: ${error.message}` :
String(error);
return errorResponse(`Error listing resources: ${errorMessage}`);
}
}
};