Inspiration

Mutual-aid groups and small nonprofits run on Slack, and Slack is exactly where their most important messages quietly disappear. Someone urgently needs insulin in one channel, while a pharmacy donation was offered three weeks ago in a different channel that nobody rereads. A volunteer suggests contacting a funder the team already emailed months ago and never heard back from. In a crisis, no one has time to scroll through hundreds of messages to connect these dots.

We wanted an agent that quietly does that connecting, instantly, and with the receipts to prove it.

What it does

CoreHive is a Slack agent for community aid teams. It watches every channel and does two life-helping jobs using one shared engine:

Crisis coordination. Every message is auto-classified as a need, an offer, a funder lead, or just noise. A need is matched in real time against every offer the workspace has ever posted, across all channels, and both message threads get linked together with a clickable source link. Urgent needs that nobody answers are escalated to a coordinator channel automatically.

Fundraising memory. Any mention of a funder is checked against the team's entire Slack history ("we emailed them in April, no reply") and enriched with real outside data: open grants from Grants.gov and public tax records from ProPublica. New funders get a drafted intro email that a human reviews and sends to exactly one recipient. CoreHive never auto-sends and has no bulk path.

You can also just talk to it. A login-protected web dashboard shows live stats and a floating voice agent (Gemini Live). Ask out loud "my friend needs insulin, do we have any?" and it searches your Slack, answers by voice, and sends you a direct message with the exact matching post. You can even point your camera at a medicine box and ask if the team has it.

Every single answer cites the Slack message it came from. No unsourced claims.

How we built it

CoreHive architecture

The core is a four-step agent pipeline, built as clear, debuggable stages:

  1. Triage. One Gemini call classifies the message and extracts the resource, location, urgency, or funder name.
  2. Matching. The heart of the product. A single reusable search_workspace() function calls Slack's Real-Time Search API (assistant.search.context) to search the whole workspace. The exact same function powers both the crisis matcher and the funder-memory lookup. That shared engine is the whole technical idea, not two separate features bolted together.
  3. Discovery. External context arrives through our own MCP server (Model Context Protocol) that wraps Grants.gov, ProPublica, and the National Weather Service.
  4. Synthesis. Gemini merges everything and acts: threaded replies with source links, a live shared Canvas board, coordinator escalations, cited funder summaries, and human-approved outreach emails.

Stack: Python with Slack Bolt (Socket Mode) for the agent, Gemini via Google Vertex AI for classification and writing, a Flask web app with SQLite for the dashboard and admin logins, and the Gemini Live API in the browser for the real-time voice assistant. All three required technologies (Slack AI, an MCP server, and the Real-Time Search API) are load-bearing, not decorative.

Challenges we ran into

Real-Time Search auth was subtle. We found through testing that Slack only attaches the required action_token to messages aimed at the app (mentions and DMs), never to normal channel messages. So passive cross-channel matching, which is the whole point, runs on a user-scoped search token, while the mention and assistant flows use the action-token path.

Voice cannot live inside Slack. Slack has no real-time audio API, so a phone-call style agent is not possible in Slack itself. We put a genuine live voice agent on the web dashboard instead, wired to the same engine, and pinned it to English so it does not drift into other languages it hears in the background.

Keeping the matcher honest. Keyword search returns loose hits, so we added an LLM ranking pass and strict funder-name filtering so CoreHive never claims a match that is not real. A wrong match wastes a coordinator's time in a crisis.

Graceful failure everywhere. If the LLM or the MCP server is down, the app falls back to keyword triage and still runs, so a demo never hard-crashes.

Accomplishments that we're proud of

  • One genuinely shared engine behind two very different use cases.
  • Every claim is cited with a real Slack permalink, trustworthy by design.
  • A real, working live voice and camera assistant grounded entirely in the team's own Slack.
  • A /corehive sync command that reads existing history so the board is useful the moment you install it, with no cold start.
  • Safety built in: no bulk outreach, human-gated sending, and search data is never stored.

What we learned

How to work within real platform limits (Slack's token model, no audio API, free-tier voice models), how the Model Context Protocol cleanly separates "our knowledge" (Slack) from "the world's knowledge" (grants, weather), and that for a crisis tool, citing the source matters as much as finding the answer.

What's next for CoreHive

Private-channel matching with per-user consent, grant-deadline reminders driven from the pipeline board, and multi-workspace federation so regional mutual-aid coalitions can share offers across organizations.

Built With

Share this project:

Updates

Submission history