The tools an agent can call at runtime aren’t pinned at create-time — they’re resolved dynamically from the sandbox’s connected data sources. Connect a new Slack integration, and every agent in the sandbox sees Slack tools next time they run. Disconnect it, they don’t. Two stacked controls decide what an agent actually sees:Documentation Index
Fetch the complete documentation index at: https://docs.copass.com/llms.txt
Use this file to discover all available pages before exploring further.
| Control | Source | Effect |
|---|---|---|
tool_sources | Agent row | Which resolvers compose at all (copass_retrieval, pipedream, user_mcp, …) |
tool_allowlist | Agent row | Which tool names are callable from those sources. [] = all allowed |
tool_sources controls the resolvers. tool_allowlist controls the names. Both are JSON columns on the agent row; the Concierge can update either.
What you can do
- Inspect the live tool catalog an agent will see at runtime.
- Tighten an agent’s allowlist to specific tool names.
- Add or remove tool sources (e.g. enable a custom MCP source, disable Pipedream).
- Audit why an agent saw the tools it saw on a specific run.
Via the Concierge (recommended)
“What tools does my support agent have right now?” “Lock the support agent to only the Slack and GitHub tools.” “Add my custom MCP server’s tools to the triage agent.” “Why didn’t my agent use any tools on that last run?”The last one pulls the run’s tool-resolution trace and points to whichever gap (allowlist drift, missing source, missing OAuth) caused the silent no-op.
Via the CLI
Via the SDK / API
Naming conventions
Tool names are stable wire identifiers. They appear in the agent’stool_allowlist, in the run’s tool-resolution trace, and in the model’s catalog at runtime.
| Source | Name shape | Example |
|---|---|---|
| Pipedream integrations | pd_<app_slug>_<remote_tool_name> | pd_slack_v2_slack_v2-add-reaction |
| Copass retrieval | discover / interpret / search | (built-in) |
| Custom MCP | <source_label>_<remote_tool_name> | internal_mcp_lookup_customer |
Diagnosing “agent did nothing”
Most “my agent fired but didn’t use tools” issues fall into three buckets:- Allowlist drift — a tool the allowlist names doesn’t exist anymore (renamed, integration disconnected). Filtered out, agent runs tool-less.
- Missing OAuth — the integration was disconnected; no resolver builds, no tools advertised.
- Source not in
tool_sources— you connected Slack but the agent’stool_sourcesdoesn’t includepipedream.
get_run_trace) surfaces all three explicitly. From the CLI:
Common patterns
Open while iterating, locked at ship
Develop with
tool_allowlist: []. When the agent is stable, snapshot the actually-used tool names and lock to that list.Inspect before allowlisting
Always run
agent tools (or “what tools does X have?”) before writing an allowlist. Names are exact.Per-source tool sets
A retrieval-only agent can drop
pipedream from tool_sources entirely. Smaller catalog = better selection accuracy.Custom MCP for private tools
Internal APIs your agent should call: wrap them in an MCP server, register as
user_mcp, and they show up in the catalog. See Custom MCP.Next steps
- Build an agent — set tool sources and allowlist at create time.
- Runs — diagnose tool-resolution traces.
- Integrations — where most tools come from.
- Custom MCP — bring your own tool surface.

