# MCPConfig now publishes only the tools you list

> Agno's `MCPConfig` sets `default_tools` and `lifecycle_tools` to `False`, so an AgentOS MCP server built with `tools=[...]` lists those tools and no built-ins. Set `default_tools=True` to serve the eight built-in tools again.

- Published: 2026-10-01
- Author: Ashpreet Bedi
- Categories: Changelog
- Canonical: https://www.agno.com/blog/mcpconfig-now-publishes-only-the-tools-you-list
- Markdown: https://www.agno.com/blog/mcpconfig-now-publishes-only-the-tools-you-list.md

In Agno, `MCPConfig(tools=[...])` mounts an AgentOS MCP server whose `tools/list` returns the tools you passed and nothing else, because `default_tools` and `lifecycle_tools` now both default to `False`. Earlier releases added the eight built-in tools, including `continue_run` and `cancel_run`, to every config that listed its own.

```python
from agno.db.sqlite import SqliteDb
from agno.os import AgentOS, MCPConfig

def get_order_status(order_id: str) -> str:
    """Look up the shipping status of an order."""
    return f"Order {order_id} shipped."

db = SqliteDb(db_file="tmp/agentos.db")
agent_os = AgentOS(db=db, mcp=MCPConfig(tools=[get_order_status]))
```

We served this config from both releases and called `tools/list` on `/mcp`.

![Before and now comparison of tools/list for MCPConfig(tools=[get_order_status]), real output from the AgentOS /mcp endpoint. Before, the server listed 9 tools: get_agentos_config, run_agent, run_team, run_workflow, continue_run, cancel_run, get_sessions, get_session_runs and get_order_status. Now it lists 1 tool, get_order_status.](https://www.agno.com/images/v3-1-0-mcp-opt-in-tools.png)

### Keep the old tool surface

This change breaks clients that call a built-in tool on a server configured with `tools=[...]`. Pick the flag that matches what they use:

```python
# All eight built-in tools next to yours, as before
MCPConfig(tools=[get_order_status], default_tools=True)

# Only continue_run and cancel_run, for published agents, teams and workflows
MCPConfig(tools=[support_agent], lifecycle_tools=True)
```

`lifecycle_tools=True` matters when a published component can pause on a tool that needs confirmation. Without it, the paused result tells the client how to resume the run over REST. `AgentOS(mcp=True)` keeps all eight built-ins, and a bare `MCPConfig()` now raises "MCPConfig would register zero tools" at construction. An `include_tags` filter only scopes default tools, so it logs a warning unless `default_tools=True` is set.

### Auth on the MCP endpoint

The built-in tools on `/mcp` now run through the same authorization provider and audit log as the matching REST routes. With `mcp_auth` set, an AgentOS JWT from an issuer outside the `Authorization` issuer pin fails on `/mcp` as it does on REST, and a user disabled in the user directory gets a 403 with `User is disabled`.

See the [cookbook](https://github.com/agno-agi/agno/blob/main/cookbook/05_agent_os/14_mcp/custom_tools.py), and learn more about [publishing selected components](https://docs.agno.com/features/mcp-server#publish-selected-components) in the documentation.
