@asanstefanski/everhour-mcp-server
Version:
Complete Everhour API integration for Model Context Protocol (MCP) with 100% endpoint coverage
119 lines • 4.43 kB
JavaScript
import { z } from 'zod';
// Zod schemas for input validation
const ListUsersSchema = z.object({
page: z.number().optional(),
limit: z.number().optional(),
query: z.string().optional(),
});
export const userTools = {
everhour_get_current_user: {
name: 'everhour_get_current_user',
description: 'Get the current user profile using the /me endpoint.',
readonly: true,
operationType: 'read',
affectedResources: ['users'],
inputSchema: {
type: 'object',
properties: {},
},
handler: async (client, args) => {
try {
const user = await client.getCurrentUser();
return {
content: [
{
type: 'text',
text: JSON.stringify({
user: {
id: user.id,
name: user.name,
email: user.email,
role: user.role,
status: user.status,
avatarUrl: user.avatarUrl,
timezone: user.timezone,
createdAt: user.createdAt,
updatedAt: user.updatedAt,
},
}, null, 2),
},
],
};
}
catch (error) {
return {
content: [
{
type: 'text',
text: `Error getting current user: ${error instanceof Error ? error.message : 'Unknown error'}`,
},
],
isError: true,
};
}
},
},
everhour_list_team_users: {
name: 'everhour_list_team_users',
description: 'List all team users using the /users endpoint. Supports pagination and search query.',
readonly: true,
operationType: 'read',
affectedResources: ['users'],
inputSchema: {
type: 'object',
properties: {
page: {
type: 'number',
description: 'Page number for pagination (default: 1)',
},
limit: {
type: 'number',
description: 'Number of users per page (default: 100)',
},
query: {
type: 'string',
description: 'Search query to filter users by name or email',
},
},
},
handler: async (client, args) => {
const params = ListUsersSchema.parse(args);
try {
const users = await client.getUsers(params);
return {
content: [
{
type: 'text',
text: JSON.stringify({
users: users.map(user => ({
id: user.id,
name: user.name,
email: user.email,
role: user.role,
status: user.status,
avatarUrl: user.avatarUrl,
timezone: user.timezone,
createdAt: user.createdAt,
updatedAt: user.updatedAt,
})),
total: users.length,
}, null, 2),
},
],
};
}
catch (error) {
return {
content: [
{
type: 'text',
text: `Error listing team users: ${error instanceof Error ? error.message : 'Unknown error'}`,
},
],
isError: true,
};
}
},
},
};
//# sourceMappingURL=users.js.map