ls, grep, open the file, follow the import. Scout does the same thing across Slack, Drive, and the rest. It searches the channel, opens the doc, expands the thread, and assembles context at question time from the live source.
How it works
Scout is a single agent with multiple context providers. Each provider exposes two natural-language tools:query_<source> for reads and update_<source> for writes, where the source supports them. This thin layer solves three problems that hit any agent with a diverse tool surface: context pollution from too many tools, degrading performance from overlapping scopes, and the main agent forgetting its job because its context is all tool quirks.
A sub-agent behind each provider owns the source’s quirks. Scout sees query_slack. Behind it, a sub-agent knows to paginate by cursor and prefer conversations.replies for threads. Scout’s context never sees any of that.
| Provider | Active when | Tools |
|---|---|---|
| Web | Always on | query_web. Uses the Parallel SDK when PARALLEL_API_KEY is set, otherwise Parallel’s free MCP server. |
| Workspace | Always on | query_workspace. Rooted at the Scout repo, so Scout can answer questions about its own codebase. |
| CRM | Always on | query_crm, update_crm. Contacts, projects, notes, follow-ups. |
| Knowledge wiki | Always on | query_knowledge, update_knowledge. Scout’s prose memory. |
| Voice wiki | Always on | query_voice. A code-managed style guide for emails, Slack, X, and long-form writing. |
| Slack | SLACK_BOT_TOKEN | query_slack. Read-only access to messages, channel history, threads, and users. |
| Google Drive | GOOGLE_SERVICE_ACCOUNT_FILE | query_gdrive. Read-only access to files, folders, and contents. |
| MCP | Registered in scout/contexts.py | One query_mcp_<slug> per server. |
Self-building knowledge
Most information Scout learns from working with you is perfect for a wiki and a CRM, so it maintains both.| System | Purpose |
|---|---|
| Wiki | Scout’s prose memory: pages about your company, projects, and runbooks |
| CRM | People and relationships: contacts, projects, notes, follow-ups |
Run locally
You need Docker Desktop installed and running.http://localhost:8000. The Scout README has the full walkthrough.
Chat with Scout
- Open os.agno.com and log in.
- Click Add OS, choose Local, enter
http://localhost:8000, then Connect. - Try the pre-configured prompts.
Deploy to Railway
Scout runs on any cloud provider. We provide scripts for Railway. Prerequisites: Railway CLI installed andrailway login run.
.env.production if any values should differ from local, like a different Slack workspace or production-only credentials. The Railway scripts read .env.production first and fall back to .env.
up.sh script provisions PostgreSQL and the scout service, then creates your public domain.
Your first deploy will fail. That’s expected. Production endpoints require RBAC authorization by default, and without a JWT_VERIFICATION_KEY the app refuses to serve traffic. Scout’s job is to keep your company data off the public web. To get your key:
- Open os.agno.com, click Add OS → Live, and enter your Railway domain.
- Enable Token Based Authorization.
- Paste the public key into
.env.productionasJWT_VERIFICATION_KEY(the full PEM block, no surrounding quotes). - Sync the env. Railway auto-deploys when values change.
Connect to Slack
Scout is designed to live in Slack as your teammate. Each Slack thread becomes a session with its own context, so follow-ups in the same thread carry forward.- Get a public URL Slack can reach:
ngrok http 8000locally, or your Railway domain in production. - Create the Slack app from the manifest in the README’s Chat with Scout in Slack section.
- Set
SLACK_BOT_TOKENandSLACK_SIGNING_SECRETin.env. - Restart Scout with
docker compose up -d.
SLACK_BOT_TOKEN on its own activates the read-only Slack context provider. Add SLACK_SIGNING_SECRET and the Slack interface lights up too, so Scout can reply in your workspace.
Example prompts
Try these once Scout is up. Each one routes to the provider that owns the answer.| Prompt | What Scout does |
|---|---|
| ”Find the latest benchmark numbers for model X.” | query_web, with cited sources |
| ”Save that as a note.” | update_crm inserts into scout.scout_notes |
| ”File a runbook for incident response.” | update_knowledge writes a markdown page under wiki/knowledge/runbooks/ |
| ”Track my coffee consumption: flat white, extra shot.” | update_crm creates scout.scout_coffee_orders and inserts the row. Schema on demand. |
| ”Draft a Slack message announcing the launch.” | query_voice loads the style guide, then Scout drafts in that voice |
Run evals
Scout ships three eval tiers. PostgreSQL must be running for every tier:docker compose up -d scout-db.
| Tier | Command | What it catches |
|---|---|---|
| Wiring | python -m evals wiring | Tool shape drift and missing schema guards. Code-level invariants, no LLM. |
| Behavioral | python -m evals | Wrong tool choices, missing response content, forbidden tools firing. |
| Judges | python -m evals judges | Answer quality, LLM-scored. |
python -m evals --case <id>. See EVALS.md for the full picture.
Source
The GitHub repo has the full provider setup guides underdocs/ and implementation notes in AGENTS.md.