list-projects
Retrieve all projects in your Plane workspace to view and manage project details for improved organization and workflow oversight.
Instructions
List all projects in the workspace
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- src/index.ts:283-289 (handler)Handler for the list-projects tool: calls Plane API to GET /projects/ and returns formatted JSON response.case "list-projects": { const projects = await callPlaneAPI("/projects/", "GET"); return { content: [{ type: "text", text: JSON.stringify(projects, null, 2) }], isError: false, }; }
- src/index.ts:31-39 (schema)Tool schema definition for list-projects: name, description, and empty input schema (no parameters required).const LIST_PROJECTS_TOOL: Tool = { name: "list-projects", description: "List all projects in the workspace", inputSchema: { type: "object", properties: {}, required: [], }, };
- src/index.ts:262-271 (registration)Registration of the list-projects tool in the ListToolsRequestHandler, exposing it in the tools list.server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: [ LIST_PROJECTS_TOOL, GET_PROJECT_TOOL, CREATE_ISSUE_TOOL, LIST_ISSUES_TOOL, GET_ISSUE_TOOL, UPDATE_ISSUE_TOOL, ], }));
- src/index.ts:198-246 (helper)Shared helper function callPlaneAPI used by list-projects handler to make authenticated API calls to Plane.async function callPlaneAPI( endpoint: string, method: string, body?: any ): Promise<any> { const baseUrl = `${PLANE_HOST}/api/v1/workspaces/${PLANE_WORKSPACE_SLUG}`; const url = `${baseUrl}${endpoint}`; const options: RequestInit = { method, headers: { "Content-Type": "application/json", "X-API-Key": PLANE_API_KEY as string, }, }; if (body && (method === "POST" || method === "PATCH")) { options.body = JSON.stringify(body); } try { const response = await fetch(url, options); if (!response.ok) { let errorText; try { errorText = await response.text(); } catch (parseError) { errorText = "Unable to parse error response"; } throw new Error( `Plane API error: ${response.status} ${response.statusText}\n${errorText}` ); } // For DELETE requests that return 204 No Content if (response.status === 204) { return { success: true }; } return await response.json(); } catch (error) { throw new Error( `Error calling Plane API: ${ error instanceof Error ? error.message : String(error) }` ); } }