← 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 Scout β†’ pricing
β†’ Changelog Scout β†’ changelog
β†’ News Scout β†’ news
β†’ Diff β†’ delta
β†’ Analyst β†’ brief

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."
}