The source allowlist is the list of places an agent is permitted to fetch text from. It has three shapes, and most teams need all three: web hosts with path prefixes, database tables and views with row filters, and document collections with metadata scopes. The work of deciding this list is small compared with the work of enforcing it, and the two must be kept separate. A team that debates the list for a week and then pastes it into a system prompt has done the deciding and skipped the enforcing.
Start from the task. If the agent answers billing questions, it needs the billing API host, the invoicing table, and the policy document collection. It does not need the public internet. Write that down as a table before you write any code.
| Source type | Identifier | Scope question to answer | Example decision |
|---|---|---|---|
| Web host | Hostname plus path prefix | Which paths, which query shapes, which methods | docs.example.com/help/ GET only |
| Database | Schema, table, view | Which columns and which rows (tenant, region) | billing.invoices filtered by tenant claim |
| Documents | Collection plus metadata | Which tags, which classification, which owner | policies where audience=customer |
| Object store | Bucket plus key prefix | Which prefix, which file types, size cap | s3://kb-public/faq/ PDF and text only |
| Third-party API | Base URL plus endpoint list | Which endpoints, which credential scope | api.vendor.com/v2/orders read scope |
The rule of thumb that separates a list you can enforce from one you cannot is specificity. A hostname with no path is a wide grant, because every URL on that host becomes reachable, including paths the site owner adds later. A hostname plus a path prefix is a narrow grant. If you cannot name a path prefix, you probably cannot justify the host.
This mirrors the guidance on server-side request forgery, which distinguishes two cases: an application that can send requests only to identified and trusted applications, where an allowlist is available, and one that can send requests anywhere, where it is not (the OWASP SSRF prevention cheat sheet). Pick the first case whenever the task allows it. Almost every agent task does.



