180 lines
5.9 KiB
TypeScript
180 lines
5.9 KiB
TypeScript
import { z } from 'zod';
|
|
import type { CalendlyClient } from '../clients/calendly.js';
|
|
|
|
export function registerOrganizationsTools(calendly: CalendlyClient) {
|
|
return [
|
|
{
|
|
name: 'calendly_get_organization',
|
|
description: 'Get information about a specific organization by URI',
|
|
inputSchema: z.object({
|
|
organization_uri: z.string().describe('The URI of the organization'),
|
|
}),
|
|
handler: async (args: { organization_uri: string }) => {
|
|
const org = await calendly.getOrganization(args.organization_uri);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(org, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_list_organization_invitations',
|
|
description: 'List all invitations for an organization',
|
|
inputSchema: z.object({
|
|
organization_uri: z.string().describe('The URI of the organization'),
|
|
count: z.number().optional().describe('Number of results per page (max 100)'),
|
|
email: z.string().optional().describe('Filter by invitee email'),
|
|
page_token: z.string().optional().describe('Token for pagination'),
|
|
sort: z.string().optional().describe('Sort field and direction (e.g., created_at:asc)'),
|
|
status: z.string().optional().describe('Filter by status: pending, accepted, declined, revoked'),
|
|
}),
|
|
handler: async (args: {
|
|
organization_uri: string;
|
|
count?: number;
|
|
email?: string;
|
|
page_token?: string;
|
|
sort?: string;
|
|
status?: string;
|
|
}) => {
|
|
const { organization_uri, ...params } = args;
|
|
const result = await calendly.listOrganizationInvitations(organization_uri, params);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_get_organization_invitation',
|
|
description: 'Get details of a specific organization invitation',
|
|
inputSchema: z.object({
|
|
invitation_uri: z.string().describe('The URI of the invitation'),
|
|
}),
|
|
handler: async (args: { invitation_uri: string }) => {
|
|
const invitation = await calendly.getOrganizationInvitation(args.invitation_uri);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(invitation, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_create_organization_invitation',
|
|
description: 'Invite a user to join an organization',
|
|
inputSchema: z.object({
|
|
organization_uri: z.string().describe('The URI of the organization'),
|
|
email: z.string().email().describe('Email address of the person to invite'),
|
|
}),
|
|
handler: async (args: { organization_uri: string; email: string }) => {
|
|
const invitation = await calendly.createOrganizationInvitation(
|
|
args.organization_uri,
|
|
args.email
|
|
);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(invitation, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_revoke_organization_invitation',
|
|
description: 'Revoke a pending organization invitation',
|
|
inputSchema: z.object({
|
|
invitation_uri: z.string().describe('The URI of the invitation to revoke'),
|
|
}),
|
|
handler: async (args: { invitation_uri: string }) => {
|
|
await calendly.revokeOrganizationInvitation(args.invitation_uri);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: 'Invitation revoked successfully',
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_list_organization_memberships',
|
|
description: 'List all memberships for an organization',
|
|
inputSchema: z.object({
|
|
organization_uri: z.string().describe('The URI of the organization'),
|
|
count: z.number().optional().describe('Number of results per page (max 100)'),
|
|
email: z.string().optional().describe('Filter by member email'),
|
|
page_token: z.string().optional().describe('Token for pagination'),
|
|
role: z.string().optional().describe('Filter by role: owner, admin, user'),
|
|
}),
|
|
handler: async (args: {
|
|
organization_uri: string;
|
|
count?: number;
|
|
email?: string;
|
|
page_token?: string;
|
|
role?: string;
|
|
}) => {
|
|
const { organization_uri, ...params } = args;
|
|
const result = await calendly.listOrganizationMemberships(organization_uri, params);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(result, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_get_organization_membership',
|
|
description: 'Get details of a specific organization membership',
|
|
inputSchema: z.object({
|
|
membership_uri: z.string().describe('The URI of the membership'),
|
|
}),
|
|
handler: async (args: { membership_uri: string }) => {
|
|
const membership = await calendly.getOrganizationMembership(args.membership_uri);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: JSON.stringify(membership, null, 2),
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
{
|
|
name: 'calendly_remove_organization_membership',
|
|
description: 'Remove a user from an organization',
|
|
inputSchema: z.object({
|
|
membership_uri: z.string().describe('The URI of the membership to remove'),
|
|
}),
|
|
handler: async (args: { membership_uri: string }) => {
|
|
await calendly.removeOrganizationMembership(args.membership_uri);
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: 'Membership removed successfully',
|
|
},
|
|
],
|
|
};
|
|
},
|
|
},
|
|
];
|
|
}
|