Inspiration
I use Slack every day, and I noticed that new members often ask questions that were already answered because useful information gets buried under hundreds of messages.
That made me realize it was not just a search problem, but a connection problem. Every community has people who need help and people willing to offer their skills, knowledge, time, or resources, they simply do not find each other at the right moment.
That idea became Loop.
What it does
Loop is a Slack agent that connects people who need help with people who can provide it, quietly and only with consent.
It reads channel messages and classifies them as a need, offer, or neither. Irrelevant messages are ignored silently.
Loop remembers offers even after they disappear in chat history. When someone posts a need, it searches saved offers and Slack message history, ranks suitable helpers, and suggests a match inside the thread.
Nothing happens automatically. The requester clicks Ask, the helper receives a private message, and Loop introduces them only after the helper agrees.
How we built it
Loop is a single Bolt for JavaScript application running through Socket Mode, so it does not need a public server URL.
It uses:
- Slack AI for the assistant and App Home experience
- Slack MCP Server for search, read, and send tools
- Real-Time Search API to find helpers from live Slack history
- Groq
gpt-oss-120bfor message classification and candidate ranking - SQLite for storing offers, needs, consent status, and matches
- Block Kit for suggestion cards, consent messages, and introductions
Candidates are created using:
$$ \text{Candidates} = (\text{Saved Offers} \cup \text{Slack Search Results}) \setminus {\text{Requester}} $$
The matching flow follows:
open → awaiting_consent → matched
Challenges we ran into
Free LLM access: Gemini returned a zero free-tier quota in our region, so we switched to Groq.
MCP token limits: Loading all Slack MCP tools exceeded Groq's token limit. We fixed this by loading only the tools Loop actually needs.
Consent and privacy: Loop never volunteers or exposes anyone automatically. Every introduction requires approval.
Avoiding noise: Most normal conversations are classified as neither and ignored.
Accomplishments that we're proud of
- Used Slack AI, MCP, and Real-Time Search together
- Built the complete workflow using free-tier services
- Made consent and privacy part of the core architecture
- Created bidirectional matching where anyone can give or receive help
What we learned
We learned how to combine Bolt, Socket Mode, MCP, Real-Time Search, Block Kit, SQLite, and LLMs into one complete Slack agent.
We also learned that LLMs are most reliable when used for narrow tasks, while real Slack history provides the actual matching data.
Most importantly, we learned that for community products, consent and privacy are not extra features, they are the product.
What's next for Loop
- Suggest another helper when the first person declines
- Improve rankings using 👍 and 👎 feedback
- Add multilingual matching
- Add scheduling and reminders
- Make Loop installable by nonprofits, campuses, teams, and communities
Built With
- biome
- block-kit
- bolt-for-javascript
- groq
- javascript
- model-context-protocol
- node.js
- openai-agents-sdk
- real-time-search-api
- slack
- slack-ai
- slack-cli
- slack-events-api
- slack-web-api
- socket-mode
- sqlite
- zod
Log in or sign up for Devpost to join the conversation.