Inspiration

Early-stage deal flow shows up in Slack all day. Someone forwards a pitch, drops a company name, pastes a one-line description. A person has to read it, guess the sector, guess the stage, decide if it fits the fund's thesis. That triage step is repetitive and inconsistent across a team.

What it does

Mention the bot with any company description in Slack. It replies in-thread within seconds with a structured card:

  • Sector
  • Stage guess
  • One-liner description in plain language
  • Thesis signal — any notable overlap or pattern worth flagging
  • Confidence rating, so the team knows when to trust the read and when to dig in manually

It also tracks whether a company has already come up before. If it has, the card flags the prior mention instead of starting from zero each time.

How i built it

The bot runs on Slack Bolt for Python, connected through Socket Mode. This means no public server or hosting is needed. It runs locally and holds a persistent connection to Slack over a websocket.

When someone @mentions the bot, Slack's Events API delivers an app_mention event. The app strips out the mention itself, sends the remaining text to the Claude API (Haiku 4.5) with a system prompt that returns strict JSON, and maps that response into a Block Kit card. The card includes headers, fields, and a confidence indicator, so the reply looks like a real tool output instead of a plain chatbot message.

Challenges i ran into

Slack's token model took a few passes to get right. Socket Mode needs an app-level token (xapp-) with the connections:write scope. That's separate from the bot token (xoxb-) used to post messages, and separate again from Bot Token Scopes versus User Token Scopes, which look similar but govern completely different things. Every scope change also needs a reinstall before it takes effect, which wasn't obvious the first time.

What i learned

Socket Mode is a genuinely fast way to prototype a Slack agent solo, since it skips the need for a public URL entirely. The bigger lesson was around scope hygiene: Slack's permission model is granular by design, and most connection failures traced back to a token being asked to do something it was never scoped for, not a code bug.

What's next

The natural next step is wiring an MCP server for real firmographic enrichment, so the thesis signal is grounded in actual funding and headcount data instead of inference alone. That would turn this from a fast classifier into a genuine research assistant.

Built With

  • anthropic
  • block-kit
  • claude
  • llm
  • python
  • slack
  • slack-api
  • slack-bolt
  • socket-mode
  • vc
Share this project:

Updates