Scout

Company intelligence agent for teams that need answers across live web, Slack, Drive, wiki, CRM, and MCP sources.

This guide follows the reviewed application revision, which pins Agno 2.7.0. Use its checked-in requirements to reproduce the application.

Scout is a company intelligence agent for teams that need answers across live web, Slack, Drive, wiki, CRM, and MCP sources.

Scout searches the system that owns the information and assembles context at question time. It can open a document, expand a Slack thread, search the web, and follow related information across sources. Scout also maintains a wiki and CRM so useful company context becomes easier to retrieve over time.

The code is public at agno-agi/scout.

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.

ProviderActive whenTools
WebAlways onquery_web. Uses the Parallel SDK when PARALLEL_API_KEY is set, otherwise Parallel's free MCP server.
WorkspaceAlways onquery_workspace. Rooted at the Scout repo, so Scout can answer questions about its own codebase.
CRMAlways onquery_crm, update_crm. Contacts, projects, notes, follow-ups.
Knowledge wikiAlways onquery_knowledge, update_knowledge. Scout's prose memory.
Voice wikiAlways onquery_voice. A code-managed style guide for emails, Slack, X, and long-form writing.
SlackSLACK_BOT_TOKENIntended to expose query_slack for read-only access. The pinned template also exposes update_slack; see the warning below.
Google DriveGOOGLE_SERVICE_ACCOUNT_FILEquery_gdrive. Read-only access to files, folders, and contents.
MCPRegistered in scout/contexts.pyOne query_mcp_<slug> per server.

Scout intends Slack access to be read-only, but the pinned template does not pass write=False when it creates SlackContextProvider. Configuring Slack currently exposes update_slack. Leave write scopes ungranted until the template enforces its intended boundary.

Setup for each provider is covered in the Scout README's Context Providers section.

Self-building knowledge

Most information Scout learns from working with you is perfect for a wiki and a CRM, so it maintains both.

SystemPurpose
WikiScout's prose memory: pages about your company, projects, and runbooks
CRMPeople and relationships: contacts, projects, notes, follow-ups

Both start empty and grow with use. Mention that Josh from Anthropic shared a new RLM paper, and Scout adds Josh to the CRM, parses the paper into the wiki, and links them. See How Scout works in the README for how both systems work.

Run locally

You need Docker Desktop installed and running.

git clone https://github.com/agno-agi/scout && cd scout

cp example.env .env
# set OPENAI_API_KEY in .env

docker compose up -d --build

Scout is now running at http://localhost:8000. The Scout README has the full walkthrough.

Chat with Scout

  1. Open os.agno.com and log in.
  2. Click Add OS, choose Local, enter http://localhost:8000, then Connect.
  3. Try the pre-configured prompts.

Deploy to Railway

Scout runs on any cloud provider. We provide scripts for Railway.

Prerequisites: Railway CLI installed and railway login run.

cp .env .env.production

Edit .env.production if any values should differ from local, like a different Slack workspace or production-only credentials. up.sh prefers .env.production and falls back to .env. env.sh requires .env.production by default; pass a file explicitly, such as ./scripts/railway/env.sh .env, to select another file.

./scripts/railway/up.sh

The 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:

  1. Open os.agno.com, click Add OSLive, and enter your Railway domain.
  2. Enable Token Based Authorization.
  3. Add the full public key to .env.production as a single-quoted multiline JWT_VERIFICATION_KEY value, as shown below.
  4. Sync the env. Railway auto-deploys when values change.
JWT_VERIFICATION_KEY='-----BEGIN PUBLIC KEY-----
MIIBIjANBgkq...
-----END PUBLIC KEY-----'

Use the actual public key from your connection.

./scripts/railway/env.sh       # sync .env.production to Railway
./scripts/railway/redeploy.sh  # push code updates after up.sh

For production, swap the knowledge wiki to a Git-backed repo so pages survive container restarts. The README's Deploy to Railway section covers that, plus connecting the repo to Railway for auto-deploys on every push.

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.

  1. Get a public URL Slack can reach: ngrok http 8000 locally, or your Railway domain in production.
  2. Create the Slack app from the manifest in Scout's Slack setup guide.
  3. Set SLACK_BOT_TOKEN and SLACK_SIGNING_SECRET in .env.
  4. Restart Scout with docker compose up -d.

Setting SLACK_BOT_TOKEN activates the Slack context provider. The pinned template also exposes update_slack as described above. Adding SLACK_SIGNING_SECRET enables the Slack interface 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.

PromptWhat 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. After the local Docker setup, run them inside scout-api so the required packages, credentials, and PostgreSQL connection are available. Every tier requires the database.

TierCommandWhat it catches
Wiringdocker exec -it scout-api python -m evals wiringTool shape drift and missing schema guards. Code-level invariants, no LLM.
Behavioraldocker exec -it scout-api python -m evalsWrong tool choices, missing response content, forbidden tools firing.
Judgesdocker exec -it scout-api python -m evals judgesAnswer quality, LLM-scored.

Run a single case with docker exec -it scout-api python -m evals --case <id>. See EVALS.md for the full picture.

Source

The GitHub repo has the full provider setup guides under docs/ and implementation notes in AGENTS.md.