Inspiration Finding the right person to ask inside a company depends on informal networks. New hires don't have them. The information needed to route these questions already exists in Slack message history.
What it does CollabFinder indexes public Slack channels and builds a per-person expertise profile from message activity. Users query it and get ranked people with the evidence behind the ranking and a confidence level.
Query surfaces: /collab , DM, the agent pane, an App Home search box, and an MCP tool (query_experts) callable by other agents. All use the same ranking code.
Scoring: authored threads weigh 3.0 (plus a bonus per reply received), thread replies 2.0, standalone messages 1.0, questions 0.5. Scores decay with a 90-day half-life. Results state the evidence ("authored 3 threads in #legal-compliance, drew 12 replies") and a confidence band. A profile whose only evidence is asking questions is capped at low confidence. Queries with no matching signal return an empty result.
If the org's consultant directory matches the topic, results also include an external consultant: name, credentials, rate, booking link. Only directory entries with verified credentials are shown. Booking links carry a referral tag and clicks are logged; the platform charges the consultant a commission on referred business. Consultation payment happens on the consultant's own booking page.
Privacy controls: only public channels and @mentions are read, which the bot's OAuth scopes enforce (search:read.public, channels:history). Message content is never quoted in results. Channels under org-configured expanded monitoring get a pinned notice. /collab opt-out removes a user from indexing and results immediately; the App Home tab shows each user their own indexed topics and opt-out state. Indexer reads are logged.
How we built it
Indexer: Python, Slack Web API, public channels only, writes an audit log Profile store: local JSON; Firestore and BigQuery attach via env vars
MCP server: FastAPI, streamable HTTP at /mcp plus REST, deployed on Cloud Run, registered via Slack's MCP Servers integration
Slack app: Bolt (Python) over Socket Mode — slash command, agent pane, DM, App Home, pinned banner
Demo data: deterministic seeder generates 10 personas and ~500 threaded messages across 9 channels, including a high-volume/low-expertise persona as a ranking control 19 tests cover the decay math, question weighting, opt-out enforcement, ranking, and directory filtering
Challenges we ran into
First live index ranked the noisiest persona #1 because the seed corpus let non-experts post answer-type replies. Fixed the corpus generator and re-seeded.
Questions are thread parents, so askers scored as authors. Added question detection (0.5 weight) and separate evidence tracking.
Substring topic matching matched "access review" to "accessibility". Switched to whole-word matching.
Slack's agent threads, DMs, and Home tab are separate event surfaces; unified them behind one responder.
Enterprise sandbox rate limits interrupted seeding; made the seeder resume-safe (reads existing messages, posts only the difference).
Accomplishments that we're proud of
All demo queries return the correct expert with accurate evidence strings, verified against the live workspace
Opt-out enforced at both write and read paths, with tests
Ranking is not gameable by message volume, demonstrated by the control persona
Reproducible pipeline: wipe → seed → index → query
What we learned
Reply and thread structure carries more expertise signal than message frequency. Most of the effort went into making the evidence strings accurate rather than into the ranking itself; overstated evidence was the most common bug.
What's next for CollabFinder
Stripe Connect for commission collection from consultants
Team gap analysis against a project brief
Onboarding suggestions for new hires
Alerts when a topic's only active expert goes inactive
Swap keyword extraction for embeddings
Built With
- anthropic-claude-api-(claude-sonnet-4-6)-other-mcp-(model-context-protocol)
- bigquery-(analytics-+-audit-log)-apis-slack-real-time-search-api
- block-kit
- canvas)-cloud-services-google-cloud-run
- dockerlanguages-python
- google-cloud-storage-databases-firestore-(profile-store)
- javascript-frameworks-fastapi
- languages-python
- slack-bolt-sdk-platforms-slack-(agent-builder
- slack-web-api
Log in or sign up for Devpost to join the conversation.