Skip to main content
Glama

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
NameRequiredDescriptionDefault
project_uuidNoOptional UUID of a specific project
include_itemsNoInclude todos under each heading
detailNoResponse detail level. Defaults to compact.
limitNoMaximum number of headings to return

Implementation Reference

  • 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,
        });
      }
    );

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/soycanopa/SupaThings-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server