Meeting to Action LangGraph
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
Post the meeting summary to the team channel, followed by the tickets and events that were created. Keep it skimmable.
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.
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.
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.
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.
Flow
Interface
Depends on · 3 MCP servers
Linearapp.linear/lineartrackerDPublisher
Multi-account MCP for Gmail, Calendar, Drive, Docs, and Sheets — 61 tools, tokenio.github.adelaidasofia/google-workspace-mcpcalAVerified
io.github.slack/slack-mcpnot in the registry yetchat# 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."
}