Skip to main content
Glama
admin.ts12.9 kB
import { z } from 'zod'; import { zodToJsonSchema } from 'zod-to-json-schema'; import { ToolRegistry } from '../tool-registry.js'; import { AdminService } from '../services/admin.js'; /** * Register admin-related MCP tools */ export function registerAdminTools( registry: ToolRegistry, adminService: AdminService, ) { // List teams registry.registerTool( { name: 'list_teams', description: 'List all teams in the organization', inputSchema: zodToJsonSchema( z.object({ page: z.number().int().positive().default(1), perpage: z.number().int().positive().max(1000).default(1000), }), ), }, async (request) => { try { const params = request.params.arguments as { page?: number; perpage?: number; }; const result = await adminService.listTeams( params.page || 1, params.perpage || 1000, ); return { content: [ { type: 'text', text: `**Teams (${result.totalCount} total)**\\n\\n${result.teams .map( (team) => `**${team.name}** (${team.uid})\\n` + ` ID: ${team.id}\\n` + ` Email: ${team.email}\\n` + ` Members: ${team.memberCount}\\n` + ` Permission: ${team.permission}`, ) .join('\\n\\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error listing teams: ${errorMessage}`, }, ], isError: true, }; } }, ); // Get team by UID registry.registerTool( { name: 'get_team_by_uid', description: 'Get team details by UID', inputSchema: zodToJsonSchema( z.object({ uid: z.string().min(1), }), ), }, async (request) => { try { const { uid } = request.params.arguments as { uid: string }; const team = await adminService.getTeamByUid(uid); return { content: [ { type: 'text', text: `**Team: ${team.name}**\\n\\n` + `- UID: ${team.uid}\\n` + `- ID: ${team.id}\\n` + `- Email: ${team.email}\\n` + `- Members: ${team.memberCount}\\n` + `- Permission: ${team.permission}\\n` + `- Avatar URL: ${team.avatarUrl}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error getting team: ${errorMessage}`, }, ], isError: true, }; } }, ); // List users registry.registerTool( { name: 'list_users', description: 'List all users in the organization', inputSchema: zodToJsonSchema( z.object({ page: z.number().int().positive().default(1), perpage: z.number().int().positive().max(1000).default(1000), }), ), }, async (request) => { try { const params = request.params.arguments as { page?: number; perpage?: number; }; const result = await adminService.listUsers( params.page || 1, params.perpage || 1000, ); return { content: [ { type: 'text', text: `**Users (${result.totalCount} total)**\\n\\n${result.users .map( (user) => `**${user.name}** (${user.login})\\n` + ` ID: ${user.id}\\n` + ` Email: ${user.email}\\n` + ` Admin: ${user.isGrafanaAdmin ? 'Yes' : 'No'}\\n` + ` Disabled: ${user.isDisabled ? 'Yes' : 'No'}\\n` + ` Last Updated: ${user.updatedAt}`, ) .join('\\n\\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error listing users: ${errorMessage}`, }, ], isError: true, }; } }, ); // Get current user registry.registerTool( { name: 'get_current_user', description: 'Get current user information', inputSchema: zodToJsonSchema(z.object({})), }, async (_request) => { try { const user = await adminService.getCurrentUser(); return { content: [ { type: 'text', text: `**Current User: ${user.name}**\\n\\n` + `- ID: ${user.id}\\n` + `- Login: ${user.login}\\n` + `- Email: ${user.email}\\n` + `- Theme: ${user.theme}\\n` + `- Organization ID: ${user.orgId}\\n` + `- Grafana Admin: ${user.isGrafanaAdmin ? 'Yes' : 'No'}\\n` + `- Disabled: ${user.isDisabled ? 'Yes' : 'No'}\\n` + `- External: ${user.isExternal ? 'Yes' : 'No'}\\n` + `- Created: ${user.createdAt}\\n` + `- Updated: ${user.updatedAt}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error getting current user: ${errorMessage}`, }, ], isError: true, }; } }, ); // List folders registry.registerTool( { name: 'list_folders', description: 'List all folders', inputSchema: zodToJsonSchema(z.object({})), }, async (_request) => { try { const folders = await adminService.listFolders(); return { content: [ { type: 'text', text: `**Folders (${folders.length} total)**\\n\\n${folders .map( (folder) => `**${folder.title}** (${folder.uid})\\n` + ` ID: ${folder.id}\\n` + ` URL: ${folder.url}\\n${ folder.parentUid ? ` Parent: ${folder.parentUid}\\n` : '' }`, ) .join('\\n\\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error listing folders: ${errorMessage}`, }, ], isError: true, }; } }, ); // Get folder by UID registry.registerTool( { name: 'get_folder_by_uid', description: 'Get folder details by UID', inputSchema: zodToJsonSchema( z.object({ uid: z.string().min(1), }), ), }, async (request) => { try { const { uid } = request.params.arguments as { uid: string }; const folder = await adminService.getFolderByUid(uid); return { content: [ { type: 'text', text: `**Folder: ${folder.title}**\\n\\n` + `- UID: ${folder.uid}\\n` + `- ID: ${folder.id}\\n` + `- URL: ${folder.url}\\n` + `- Version: ${folder.version}\\n` + `- Created: ${folder.created}\\n` + `- Updated: ${folder.updated}\\n` + `- Created By: ${folder.createdBy}\\n` + `- Updated By: ${folder.updatedBy}\\n${ folder.parentUid ? `- Parent UID: ${folder.parentUid}\\n` : '' }- Can Save: ${folder.canSave ? 'Yes' : 'No'}\\n` + `- Can Edit: ${folder.canEdit ? 'Yes' : 'No'}\\n` + `- Can Admin: ${folder.canAdmin ? 'Yes' : 'No'}\\n` + `- Can Delete: ${folder.canDelete ? 'Yes' : 'No'}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error getting folder: ${errorMessage}`, }, ], isError: true, }; } }, ); // List API keys registry.registerTool( { name: 'list_api_keys', description: 'List all API keys', inputSchema: zodToJsonSchema(z.object({})), }, async (_request) => { try { const apiKeys = await adminService.listApiKeys(); return { content: [ { type: 'text', text: `**API Keys (${apiKeys.length} total)**\\n\\n${apiKeys .map( (key) => `**${key.name}**\\n` + ` ID: ${key.id}\\n` + ` Role: ${key.role}\\n` + ` Created: ${key.created}\\n` + ` Expires: ${key.expiration || 'Never'}\\n` + ` Last Used: ${key.lastUsedAt || 'Never'}`, ) .join('\\n\\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error listing API keys: ${errorMessage}`, }, ], isError: true, }; } }, ); // List service accounts registry.registerTool( { name: 'list_service_accounts', description: 'List all service accounts', inputSchema: zodToJsonSchema(z.object({})), }, async (_request) => { try { const serviceAccounts = await adminService.listServiceAccounts(); return { content: [ { type: 'text', text: `**Service Accounts (${serviceAccounts.length} total)**\\n\\n${serviceAccounts .map( (sa) => `**${sa.name}**\\n` + ` ID: ${sa.id}\\n` + ` Login: ${sa.login}\\n` + ` Role: ${sa.role}\\n` + ` Disabled: ${sa.isDisabled ? 'Yes' : 'No'}\\n` + ` Created: ${sa.created}\\n` + ` Avatar URL: ${sa.avatarUrl}`, ) .join('\\n\\n')}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error listing service accounts: ${errorMessage}`, }, ], isError: true, }; } }, ); // Get current organization registry.registerTool( { name: 'get_current_organization', description: 'Get current organization information', inputSchema: zodToJsonSchema(z.object({})), }, async (_request) => { try { const org = await adminService.getCurrentOrganization(); return { content: [ { type: 'text', text: `**Current Organization: ${org.name}**\\n\\n` + `- ID: ${org.id}\\n` + `- Address: ${org.address1 || 'N/A'}\\n` + `- City: ${org.city || 'N/A'}\\n` + `- Country: ${org.country || 'N/A'}\\n` + `- State: ${org.state || 'N/A'}\\n` + `- ZIP Code: ${org.zipCode || 'N/A'}`, }, ], }; } catch (error) { const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred'; return { content: [ { type: 'text', text: `Error getting current organization: ${errorMessage}`, }, ], isError: true, }; } }, ); }

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/quanticsoul4772/grafana-mcp'

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