get-headings
Extract and organize headings from Things 3 projects to analyze task structure and hierarchy, supporting project management and content organization.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| project_uuid | No | Optional UUID of a specific project | |
| include_items | No | Include todos under each heading | |
| detail | No | Response detail level. Defaults to compact. | |
| limit | No | Maximum number of headings to return |
Implementation Reference
- src/index.ts:970-1013 (handler)The "get-headings" tool implementation, which queries the database for heading items, optionally filtered by project UUID, and optionally includes tasks nested under each heading.
server.tool( "get-headings", { project_uuid: z.string().optional().describe("Optional UUID of a specific project"), include_items: z.boolean().optional().describe("Include todos under each heading"), detail: z.enum(["compact", "full"]).optional().describe("Response detail level. Defaults to compact."), limit: z.number().int().positive().optional().describe("Maximum number of headings to return"), }, async ({ project_uuid, include_items, detail, limit }) => { const requestedDetail = detail ?? "compact"; const headings = await withDatabase((db) => { const tasks = getAllTasks(db); let result = tasks.filter((task) => task.type === "heading" && !task.trashed); if (project_uuid) { result = result.filter((task) => task.projectId === project_uuid); } result = applyLimit(result, limit); if (!include_items) { return result.map((heading) => toTaskView(heading, requestedDetail)); } return result.map((heading) => ({ ...toTaskView(heading, requestedDetail), items: tasks .filter( (task) => task.type === "to-do" && task.headingId === heading.id && !task.trashed ) .map((task) => toTaskView(task, requestedDetail)), })); }); return buildTextResponse(`Found ${headings.length} headings`, { headings, detail: requestedDetail, limit: limit ?? null, }); } );