Forager
Turn resolved Slack threads into a queryable knowledge base.
Applied AI / agent infrastructure · Portfolio demo — hybrid sample mode plus real uploaded Slack-export backend
What it does
Forager scans resolved Slack threads, extracts canonical question-and-answer pairs, scores them for confidence, and exposes them as a queryable knowledge surface — rendered here as an MCP-style tool response.
The original demo used 10 synthetic engineering threads. It now also supports a real-data path: upload a Slack export JSON file, let the backend group it into threads and extract Q&A server-side, then query your own workspace knowledge without wiring live Slack OAuth.
What it proves
- Real backend + real data path — uploaded Slack export JSON goes through a server endpoint that normalizes threads and extracts answers outside the browser.
- RAG pipeline design — retrieval over unstructured conversation data with citation-friendly thread grouping and weighted lexical matching.
- Confidence scoring — every extracted answer carries a confidence derived from social signals (reactions, resolution status, confirmation) rather than arbitrary assignment.
- MCP fluency — the query panel emits a tool-style response envelope, showing the contract an agent would consume.
How the harvester works
- Question detection — identifies messages with question syntax or trailing "?".
- Answer resolution — scans subsequent messages for the first substantive reply with helpful reactions (💡, 👍) or confirmation signals.
- Confidence scoring — 0.5 base + 0.2 for resolved threads + up to 0.2 for reactions + 0.1 for explicit thanks.
- Query matching — token overlap scoring across question, answer, and thread context.
Honest limits
- No live Slack OAuth — the real-data mode uses uploaded exports, not an installed Slack app.
- No vector embeddings — matching is keyword-based, not semantic. A query about "connection pool" will not infer "PgBouncer" unless the words overlap.
- No persistent storage — uploads are processed ephemerally; the workspace is not stored after the request.
- No real MCP transport — the response panel shows the payload shape, not an actual stdio or SSE server.