@grec0/mcp-s2s-asterisk
Version:
MCP server para asistente telefónico conversacional con Asterisk S2S
103 lines (102 loc) • 3.64 kB
JavaScript
/**
* @fileoverview Project operations for the MCP Kanban server
*
* This module provides functions for interacting with projects in the Planka Kanban system,
* including creating, retrieving, updating, and deleting projects.
*/
import { z } from "zod";
import { plankaRequest } from "../common/utils.js";
import { PlankaProjectSchema } from "../common/types.js";
// Schema definitions
/**
* Schema for creating a new project
* @property {string} name - The name of the project
*/
export const CreateProjectSchema = z.object({
name: z.string().describe("Project name"),
});
/**
* Schema for retrieving projects with pagination
* @property {number} [page] - Page number for pagination (default: 1)
* @property {number} [perPage] - Number of results per page (default: 30, max: 100)
*/
export const GetProjectsSchema = z.object({
page: z.number().optional().describe("Page number for pagination (default: 1)"),
perPage: z.number().optional().describe("Number of results per page (default: 30, max: 100)"),
});
/**
* Schema for retrieving a specific project
* @property {string} id - The ID of the project to retrieve
*/
export const GetProjectSchema = z.object({
id: z.string().describe("Project ID"),
});
/**
* Schema for updating a project
* @property {string} id - The ID of the project to update
* @property {string} [name] - The new name for the project
*/
export const UpdateProjectSchema = z.object({
id: z.string().describe("Project ID"),
name: z.string().optional().describe("Project name"),
});
/**
* Schema for deleting a project
* @property {string} id - The ID of the project to delete
*/
export const DeleteProjectSchema = z.object({
id: z.string().describe("Project ID"),
});
// Response schemas
const ProjectsResponseSchema = z.object({
items: z.array(PlankaProjectSchema),
included: z.record(z.any()).optional(),
});
const ProjectResponseSchema = z.object({
item: PlankaProjectSchema,
included: z.record(z.any()).optional(),
});
/**
* Retrieves projects with pagination support
*
* @param {number} [page=1] - The page number to retrieve (1-indexed)
* @param {number} [perPage=30] - The number of projects per page (max: 100)
* @returns {Promise<{items: Array<object>, included?: object}>} Paginated projects
* @throws {Error} If retrieving projects fails
*/
export async function getProjects(page = 1, perPage = 30) {
try {
// Ensure perPage is within limits
if (perPage > 100) {
perPage = 100;
}
const queryParams = new URLSearchParams();
queryParams.append("page", page.toString());
queryParams.append("per_page", perPage.toString());
const response = await plankaRequest(`/api/projects?${queryParams.toString()}`, {
method: "GET",
});
const parsedResponse = ProjectsResponseSchema.parse(response);
return parsedResponse;
}
catch (error) {
throw new Error(`Failed to get projects: ${error instanceof Error ? error.message : String(error)}`);
}
}
/**
* Retrieves a specific project by ID
*
* @param {string} id - The ID of the project to retrieve
* @returns {Promise<object>} The requested project
* @throws {Error} If retrieving the project fails
*/
export async function getProject(id) {
try {
const response = await plankaRequest(`/api/projects/${id}`);
const parsedResponse = ProjectResponseSchema.parse(response);
return parsedResponse.item;
}
catch (error) {
throw new Error(`Failed to get project: ${error instanceof Error ? error.message : String(error)}`);
}
}