← All blueprints

Meeting to Action LangGraph

blueprint · 5 agents · 3 MCP servers
1176★ stars
158forks
4.7rating

What it does

A summarizer turns the transcript into decisions and open questions. An extractor pulls concrete action items with owners and due dates. Two agents then run in parallel: a ticket filer creates a tracked task per action, and a calendar agent books the time-bound follow-ups. A recap agent posts the summary and everything created to the team channel. Feed it a transcript from any source.

The cast · 5 agents

Recaprecapfast

Post the meeting summary to the team channel, followed by the tickets and events that were created. Keep it skimmable.

chat.post_message
Extractorextractorreasoning

Pull the concrete action items from the transcript. For each, capture the owner and a due date if one was stated or clearly implied. Do not invent owners; mark unknowns.

no tools · reasoning only
Summarizersummarizerreasoning

Condense the transcript into the decisions made and the questions left open. Keep it to what a person who missed the meeting would need. No filler.

no tools · reasoning only
Ticket FilerticketFilerfast

Create a tracked task for each action item with its owner and due date, and a link back to the summary. Return the tasks created.

tracker.create_issue
CalendarcalendarAgentfast

For action items with a due date or that call for a follow-up meeting, create the calendar event with the owner invited. Skip items with no time component.

cal.create_event

Flow

Summarizersummary
Extractoractions
⇉ parallel
Ticket Filertickets
Calendarevents
Recaprecap

Interface

Inputs
transcriptstring
The meeting transcript text.
Outputs
recapstring
The posted recap: the summary plus the tickets and events created.
⤓ Export runnable code
# Generated by @socketcat/compiler for target: langgraph
# blueprint: com.socketcat/meeting-to-action v1.0.0   schema: socketcat.dev/blueprint/v0
# This code is yours. Edit it freely. The socketcat_runtime helper is optional and can be vendored.

from typing import TypedDict
from langgraph.graph import StateGraph, START, END
import socketcat_runtime as _rt

class State(TypedDict, total=False):
    transcript: object
    recap: object
    summary: object
    actions: object
    tickets: object
    events: object

def node_AgentInvoke_0(state):
    return _rt.run_agent("summarizer", state, {"transcript":"transcript"}, "summary")

def node_AgentInvoke_1(state):
    return _rt.run_agent("extractor", state, {"transcript":"transcript"}, "actions")

def node_Fork_2(state):
    return {}

def node_Join_3(state):
    return {}

def node_AgentInvoke_4(state):
    return _rt.run_agent("ticketFiler", state, {"actions":"actions"}, "tickets")

def node_AgentInvoke_5(state):
    return _rt.run_agent("calendarAgent", state, {"actions":"actions"}, "events")

def node_AgentInvoke_6(state):
    return _rt.run_agent("recap", state, {"events":"events","summary":"summary","tickets":"tickets"}, "recap")

def build():
    b = StateGraph(State)
    b.add_node("AgentInvoke_0", node_AgentInvoke_0)
    b.add_node("AgentInvoke_1", node_AgentInvoke_1)
    b.add_node("Fork_2", node_Fork_2)
    b.add_node("Join_3", node_Join_3)
    b.add_node("AgentInvoke_4", node_AgentInvoke_4)
    b.add_node("AgentInvoke_5", node_AgentInvoke_5)
    b.add_node("AgentInvoke_6", node_AgentInvoke_6)
    b.add_edge(START, "AgentInvoke_0")
    b.add_edge("AgentInvoke_0", "AgentInvoke_1")
    b.add_edge("AgentInvoke_1", "Fork_2")
    b.add_edge("Fork_2", "AgentInvoke_4")
    b.add_edge("Fork_2", "AgentInvoke_5")
    b.add_edge("Join_3", "AgentInvoke_6")
    b.add_edge("AgentInvoke_4", "Join_3")
    b.add_edge("AgentInvoke_5", "Join_3")
    b.add_edge("AgentInvoke_6", END)
    return b.compile()

INPUTS = ["transcript"]
OUTPUTS = ["recap"]

if __name__ == "__main__":
    _rt.main(build, INPUTS, OUTPUTS)
blueprint.json (the portable format)
{
  "id": "com.socketcat/meeting-to-action",
  "flow": {
    "type": "sequence",
    "blocks": [
      {
        "in": {
          "transcript": "transcript"
        },
        "out": "summary",
        "use": "summarizer",
        "type": "agent"
      },
      {
        "in": {
          "transcript": "transcript"
        },
        "out": "actions",
        "use": "extractor",
        "type": "agent"
      },
      {
        "type": "parallel",
        "blocks": [
          {
            "in": {
              "actions": "actions"
            },
            "out": "tickets",
            "use": "ticketFiler",
            "type": "agent"
          },
          {
            "in": {
              "actions": "actions"
            },
            "out": "events",
            "use": "calendarAgent",
            "type": "agent"
          }
        ]
      },
      {
        "in": {
          "events": "events",
          "summary": "summary",
          "tickets": "tickets"
        },
        "out": "recap",
        "use": "recap",
        "type": "agent"
      }
    ]
  },
  "tags": [
    "productivity",
    "meetings",
    "orchestrator-workers",
    "ops"
  ],
  "title": "Meeting to Action",
  "agents": {
    "recap": {
      "model": {
        "hint": "fast"
      },
      "title": "Recap",
      "tools": [
        "chat.post_message"
      ],
      "instructions": "Post the meeting summary to the team channel, followed by the tickets and events that were created. Keep it skimmable."
    },
    "extractor": {
      "model": {
        "hint": "reasoning"
      },
      "title": "Extractor",
      "instructions": "Pull the concrete action items from the transcript. For each, capture the owner and a due date if one was stated or clearly implied. Do not invent owners; mark unknowns."
    },
    "summarizer": {
      "model": {
        "hint": "reasoning"
      },
      "title": "Summarizer",
      "instructions": "Condense the transcript into the decisions made and the questions left open. Keep it to what a person who missed the meeting would need. No filler."
    },
    "ticketFiler": {
      "model": {
        "hint": "fast"
      },
      "title": "Ticket Filer",
      "tools": [
        "tracker.create_issue"
      ],
      "instructions": "Create a tracked task for each action item with its owner and due date, and a link back to the summary. Return the tasks created."
    },
    "calendarAgent": {
      "model": {
        "hint": "fast"
      },
      "title": "Calendar",
      "tools": [
        "cal.create_event"
      ],
      "instructions": "For action items with a due date or that call for a follow-up meeting, create the calendar event with the owner invited. Skip items with no time component."
    }
  },
  "estate": {
    "events": {
      "type": "array",
      "description": "The calendar follow-ups created."
    },
    "actions": {
      "type": "array",
      "description": "Action items with owners and due dates."
    },
    "summary": {
      "type": "object",
      "description": "Decisions and open questions from the meeting."
    },
    "tickets": {
      "type": "array",
      "description": "The tracked tasks created."
    }
  },
  "$schema": "socketcat.dev/blueprint/v0",
  "authors": [
    {
      "url": "https://socketcat.com",
      "name": "SocketCat"
    }
  ],
  "license": "MIT",
  "servers": [
    {
      "ref": "app.linear/linear",
      "alias": "tracker"
    },
    {
      "ref": "io.github.adelaidasofia/google-workspace-mcp",
      "alias": "cal"
    },
    {
      "ref": "io.github.slack/slack-mcp",
      "alias": "chat"
    }
  ],
  "summary": "Condenses a meeting transcript, extracts action items, and files them as tracked tickets and calendar follow-ups in parallel.",
  "targets": [
    "langgraph",
    "*"
  ],
  "version": "1.0.0",
  "interface": {
    "inputs": {
      "transcript": {
        "type": "string",
        "description": "The meeting transcript text."
      }
    },
    "outputs": {
      "recap": {
        "type": "string",
        "description": "The posted recap: the summary plus the tickets and events created."
      }
    }
  },
  "extensions": {
    "dev.langgraph": {
      "checkpointer": "memory"
    }
  },
  "description": "A summarizer turns the transcript into decisions and open questions. An extractor pulls concrete action items with owners and due dates. Two agents then run in parallel: a ticket filer creates a tracked task per action, and a calendar agent books the time-bound follow-ups. A recap agent posts the summary and everything created to the team channel. Feed it a transcript from any source."
}