← All blueprints

Competitor Watch LangGraph

blueprint · 5 agents · 3 MCP servers
1198★ stars
174forks
4.7rating

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

Diffdiffreasoning

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.

fs.read_file
Analystanalystreasoning

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.

fs.write_filechat.post_message
News ScoutnewsScoutfast

Search recent news and launch coverage for each competitor. List announcements, funding, and launches with dates and sources.

search.news
Pricing ScoutpricingScoutfast

For each competitor, read the pricing page and record the plan names, prices, and notable limits. Report the facts only, structured per competitor.

search.web
Changelog ScoutchangelogScoutfast

For each competitor, read the changelog or release notes and list what they shipped recently, with dates. Facts only.

search.web

Flow

⇉ parallel
Pricing Scoutpricing
Changelog Scoutchangelog
News Scoutnews
Diffdelta
Analystbrief

Interface

Inputs
competitorsarray
The competitors to watch: names and the URLs of their pricing and changelog pages.
Outputs
briefstring
The brief of what changed this week, also saved and posted to Slack.

Depends on · 3 MCP servers

io.github.brave/brave-search-mcpnot in the registry yetsearch
io.github.modelcontextprotocol/filesystemnot in the registry yetfs
io.github.slack/slack-mcpnot in the registry yetchat
⤓ Export runnable code
# 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."
}

More in Research & intel

Browse all →

Deep Research

com.socketcat/deep-research
LangGraph

Splits a hard question into sub-questions, researches them in parallel to keep the wall-clock low, then synthesizes one brief with citations.

17551 server
254

Research Digest

com.socketcat/research-digest
LangGraph

Multi-source sweep, dedupe, then synthesize a cited brief. Runs on a schedule.

6902 servers
88

Literature Review Team

io.github.microsoft/literature-review
Autogen

Search agents pull papers from the web and arXiv, an analyst reads them, and a reporter writes the literature review round-robin.

50000
community ↗