Competitor Watch LangGraph
What it does
A scheduled workflow. Three scouts run in parallel, each reading a different surface of a competitor set: pricing pages, changelogs and release notes, and recent news and launches. A diff agent compares the results against the snapshot saved from the last run, keeping only real changes. An analyst writes a short brief explaining what moved and why it might matter, saves the new snapshot, and posts the brief to the strategy channel. Give it your competitor list and a schedule.
The cast Β· 5 agents
Read last run's snapshot from disk. Compare it to this run's pricing, changelog, and news. Keep only what actually changed: new prices, new features, new announcements. If nothing meaningful changed, say so plainly.
Write a short brief on what changed and why it might matter to us, grouped by competitor. Cite the source for each claim. Save the new snapshot and post the brief to the strategy channel.
Search recent news and launch coverage for each competitor. List announcements, funding, and launches with dates and sources.
For each competitor, read the pricing page and record the plan names, prices, and notable limits. Report the facts only, structured per competitor.
For each competitor, read the changelog or release notes and list what they shipped recently, with dates. Facts only.
Flow
Interface
Depends on Β· 3 MCP servers
# Generated by @socketcat/compiler for target: langgraph
# blueprint: com.socketcat/competitor-watch 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):
competitors: object
brief: object
pricing: object
changelog: object
news: object
delta: object
def node_Fork_0(state):
return {}
def node_Join_1(state):
return {}
def node_AgentInvoke_2(state):
return _rt.run_agent("pricingScout", state, {"competitors":"competitors"}, "pricing")
def node_AgentInvoke_3(state):
return _rt.run_agent("changelogScout", state, {"competitors":"competitors"}, "changelog")
def node_AgentInvoke_4(state):
return _rt.run_agent("newsScout", state, {"competitors":"competitors"}, "news")
def node_AgentInvoke_5(state):
return _rt.run_agent("diff", state, {"news":"news","pricing":"pricing","changelog":"changelog"}, "delta")
def node_AgentInvoke_6(state):
return _rt.run_agent("analyst", state, {"delta":"delta"}, "brief")
def build():
b = StateGraph(State)
b.add_node("Fork_0", node_Fork_0)
b.add_node("Join_1", node_Join_1)
b.add_node("AgentInvoke_2", node_AgentInvoke_2)
b.add_node("AgentInvoke_3", node_AgentInvoke_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, "Fork_0")
b.add_edge("Fork_0", "AgentInvoke_2")
b.add_edge("Fork_0", "AgentInvoke_3")
b.add_edge("Fork_0", "AgentInvoke_4")
b.add_edge("Join_1", "AgentInvoke_5")
b.add_edge("AgentInvoke_2", "Join_1")
b.add_edge("AgentInvoke_3", "Join_1")
b.add_edge("AgentInvoke_4", "Join_1")
b.add_edge("AgentInvoke_5", "AgentInvoke_6")
b.add_edge("AgentInvoke_6", END)
return b.compile()
INPUTS = ["competitors"]
OUTPUTS = ["brief"]
if __name__ == "__main__":
_rt.main(build, INPUTS, OUTPUTS)
βΈblueprint.json (the portable format)
{
"id": "com.socketcat/competitor-watch",
"flow": {
"type": "sequence",
"blocks": [
{
"type": "parallel",
"blocks": [
{
"in": {
"competitors": "competitors"
},
"out": "pricing",
"use": "pricingScout",
"type": "agent"
},
{
"in": {
"competitors": "competitors"
},
"out": "changelog",
"use": "changelogScout",
"type": "agent"
},
{
"in": {
"competitors": "competitors"
},
"out": "news",
"use": "newsScout",
"type": "agent"
}
]
},
{
"in": {
"news": "news",
"pricing": "pricing",
"changelog": "changelog"
},
"out": "delta",
"use": "diff",
"type": "agent"
},
{
"in": {
"delta": "delta"
},
"out": "brief",
"use": "analyst",
"type": "agent"
}
]
},
"tags": [
"competitive-intel",
"marketing",
"research",
"scheduled"
],
"title": "Competitor Watch",
"agents": {
"diff": {
"model": {
"hint": "reasoning"
},
"title": "Diff",
"tools": [
"fs.read_file"
],
"instructions": "Read last run's snapshot from disk. Compare it to this run's pricing, changelog, and news. Keep only what actually changed: new prices, new features, new announcements. If nothing meaningful changed, say so plainly."
},
"analyst": {
"model": {
"hint": "reasoning"
},
"title": "Analyst",
"tools": [
"fs.write_file",
"chat.post_message"
],
"instructions": "Write a short brief on what changed and why it might matter to us, grouped by competitor. Cite the source for each claim. Save the new snapshot and post the brief to the strategy channel."
},
"newsScout": {
"model": {
"hint": "fast"
},
"title": "News Scout",
"tools": [
"search.news"
],
"instructions": "Search recent news and launch coverage for each competitor. List announcements, funding, and launches with dates and sources."
},
"pricingScout": {
"model": {
"hint": "fast"
},
"title": "Pricing Scout",
"tools": [
"search.web"
],
"instructions": "For each competitor, read the pricing page and record the plan names, prices, and notable limits. Report the facts only, structured per competitor."
},
"changelogScout": {
"model": {
"hint": "fast"
},
"title": "Changelog Scout",
"tools": [
"search.web"
],
"instructions": "For each competitor, read the changelog or release notes and list what they shipped recently, with dates. Facts only."
}
},
"estate": {
"news": {
"type": "object",
"description": "The news scout's recent launches and announcements."
},
"delta": {
"type": "object",
"description": "The change versus last run's snapshot."
},
"pricing": {
"type": "object",
"description": "The pricing scout's current read of each competitor's plans and prices."
},
"changelog": {
"type": "object",
"description": "The changelog scout's list of recent shipped changes."
}
},
"$schema": "socketcat.dev/blueprint/v0",
"authors": [
{
"url": "https://socketcat.com",
"name": "SocketCat"
}
],
"license": "MIT",
"servers": [
{
"ref": "io.github.brave/brave-search-mcp",
"alias": "search"
},
{
"ref": "io.github.modelcontextprotocol/filesystem",
"alias": "fs"
},
{
"ref": "io.github.slack/slack-mcp",
"alias": "chat"
}
],
"summary": "A weekly competitive-intel sweep that reads pricing, changelogs, and news in parallel and reports only what changed.",
"targets": [
"langgraph",
"*"
],
"version": "1.0.0",
"interface": {
"inputs": {
"competitors": {
"type": "array",
"description": "The competitors to watch: names and the URLs of their pricing and changelog pages."
}
},
"outputs": {
"brief": {
"type": "string",
"description": "The brief of what changed this week, also saved and posted to Slack."
}
}
},
"extensions": {
"dev.langgraph": {
"checkpointer": "memory"
}
},
"description": "A scheduled workflow. Three scouts run in parallel, each reading a different surface of a competitor set: pricing pages, changelogs and release notes, and recent news and launches. A diff agent compares the results against the snapshot saved from the last run, keeping only real changes. An analyst writes a short brief explaining what moved and why it might matter, saves the new snapshot, and posts the brief to the strategy channel. Give it your competitor list and a schedule."
}