Skip to main content
Glama

Meeting Action Items

extract_meeting_action_items

Extract structured action items, decisions, and summaries from meeting notes to identify task owners, deadlines, and priorities.

Instructions

Extract structured action items, decisions, and a summary from meeting notes or transcripts. Identifies task owners, deadlines, and priorities. Powered by Claude.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
notesYesMeeting notes or transcript
formatNo'full' includes summary and decisions; 'action_items_only' returns just the task listfull
participantsNoKnown participant names to help with owner attribution

Implementation Reference

  • The handler function processes meeting notes using Claude and returns a structured object containing extracted action items, decisions, and a summary.
    async function handler(input: Input) {
      const { notes, format, participants } = input;
    
      if (!config.anthropicApiKey) {
        throw new Error("ANTHROPIC_API_KEY is not configured");
      }
    
      const client = new Anthropic({ apiKey: config.anthropicApiKey });
    
      const participantHint = participants?.length
        ? `\nKnown participants: ${participants.join(", ")}`
        : "";
    
      const systemPrompt =
        "You are an expert meeting analyst. Extract structured information from meeting notes or transcripts. " +
        "Always respond with valid JSON matching the exact schema requested. " +
        "Be concise and specific. For deadlines, use ISO 8601 date format if a specific date is mentioned, " +
        "or a relative description like 'end of week', 'next Monday', 'Q2'. " +
        "If no deadline is mentioned, omit the field. " +
        "For priority, use 'high', 'medium', or 'low' based on urgency signals in the text. " +
        "For owner, extract the person's name if mentioned, otherwise use 'Unassigned'.";
    
      const userPrompt = format === "full"
        ? `Extract all action items, key decisions, and a brief summary from the following meeting notes.${participantHint}
    
    Return a JSON object with this exact structure:
    {
      "meetingTitle": "inferred title or topic of the meeting",
      "summary": "2-3 sentence summary of what was discussed and decided",
      "actionItems": [
        {
          "id": 1,
          "owner": "person responsible (or 'Unassigned')",
          "task": "clear, specific description of what needs to be done",
          "deadline": "ISO date or relative deadline (omit if none mentioned)",
          "priority": "high | medium | low",
          "context": "brief context or reason for this task (omit if obvious)"
        }
      ],
      "decisions": [
        "decision 1",
        "decision 2"
      ]
    }
    
    Meeting notes:
    ${notes}`
        : `Extract all action items from the following meeting notes.${participantHint}
    
    Return a JSON object with this exact structure:
    {
      "meetingTitle": "inferred title or topic of the meeting",
      "actionItems": [
        {
          "id": 1,
          "owner": "person responsible (or 'Unassigned')",
          "task": "clear, specific description of what needs to be done",
          "deadline": "ISO date or relative deadline (omit if none mentioned)",
          "priority": "high | medium | low",
          "context": "brief context or reason for this task (omit if obvious)"
        }
      ]
    }
    
    Meeting notes:
    ${notes}`;
    
      const message = await client.messages.create({
        model: "claude-haiku-4-5-20251001",
        max_tokens: 2048,
        messages: [{ role: "user", content: userPrompt }],
        system: systemPrompt,
      });
    
      const rawText = message.content[0].type === "text" ? message.content[0].text : "";
    
      // Strip markdown code fences if present
      const jsonText = rawText.replace(/^```(?:json)?\n?/m, "").replace(/\n?```$/m, "").trim();
    
      let parsed: Record<string, unknown>;
      try {
        parsed = JSON.parse(jsonText);
      } catch {
        throw new Error("Failed to parse structured response from LLM");
      }
    
      const actionItems = (parsed.actionItems as unknown[]) ?? [];
    
      return {
        meetingTitle: (parsed.meetingTitle as string) ?? "Untitled Meeting",
        actionItems,
        actionItemCount: actionItems.length,
        ...(format === "full" && {
          summary: (parsed.summary as string) ?? "",
          decisions: (parsed.decisions as string[]) ?? [],
        }),
      };
    }
  • Zod schema defining the input for the meeting action items extraction tool.
    const inputSchema = z.object({
      notes: z
        .string()
        .min(10)
        .max(50_000)
        .describe("Meeting transcript or notes to extract action items from"),
      format: z
        .enum(["action_items_only", "full"])
        .default("full")
        .describe(
          "Output format: 'action_items_only' returns just the action items array; " +
          "'full' also includes a meeting summary and key decisions"
        ),
      participants: z
        .array(z.string())
        .optional()
        .describe("Known participant names to help with owner attribution (optional)"),
    });
  • The tool definition and registration for 'meeting-action-items'.
    const meetingActionItemsTool: ToolDefinition<Input> = {
      name: "meeting-action-items",
      description:
        "Extract structured action items, decisions, and a summary from meeting notes or transcripts. " +
        "Identifies owners, deadlines, and priorities. Powered by Claude.",
      version: "1.0.0",
      inputSchema,
      handler,
      metadata: {
        tags: ["meeting", "productivity", "extraction", "llm", "action-items"],
        pricing: "$0.05 per call",
        exampleInput: {
          notes: "Q3 planning meeting. Sarah will finalize the budget by Friday. John needs to set up the staging environment before the demo next Tuesday. We decided to postpone the mobile launch to Q4. Everyone agreed to use Jira for tracking.",
          format: "full",
        },
      },
    };
    
    registerTool(meetingActionItemsTool);
    
    export default meetingActionItemsTool;
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the AI-powered nature ('Powered by Claude') and specific extraction capabilities, but omits safety traits like whether the operation is read-only, if data is retained, or rate limiting concerns.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of three efficient statements totaling under 25 words. Each sentence earns its place: core functionality, specific extraction capabilities, and implementation context. No redundancy or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema, the description effectively compensates by detailing the expected return structure (action items, decisions, summary). With 100% input schema coverage and only three parameters, the description provides sufficient context for invocation, though it could benefit from explicit safety disclosures.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already fully documents all three parameters (notes, format, participants). The description aligns with this information but adds minimal semantic value beyond what the schema explicitly states, meeting the baseline for high-coverage schemas.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb (extract), input resource (meeting notes or transcripts), and specific outputs (action items, decisions, summary, task owners, deadlines, priorities). It effectively distinguishes itself from siblings like 'extract_from_text' (generic) and 'extract_contract_clauses' (legal) by specifying the meeting context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context through specificity (meeting-focused), but lacks explicit guidance on when to use this versus 'extract_from_text' for general extraction tasks. No prerequisites or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/marras0914/agent-toolbelt'

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