[Strands Agents](https://strandsagents.com) is an open-source Python SDK for building agents. Its `MCPClient` connects to the Equibles MCP server over Streamable HTTP with an API key, so a Strands agent can search SEC filings, read financial statements and earnings call transcripts, and look up insider trades and 13F holders, each figure cited to its source. There is no Equibles package to install.

## 1. Install Strands

```bash
pip install "strands-agents>=1.53"
```

`MCPClient` accepts a server URL directly from Strands 1.53, and the MCP SDK it needs comes with the package.

Strands uses Amazon Bedrock as its default model provider. The [Strands quickstart](https://strandsagents.com/docs/user-guide/quickstart/) covers Bedrock and the other providers; the Equibles side is the same for all of them.

## 2. Connect the agent

Create an API key at [/dashboard/apikeys](/dashboard/apikeys) (it starts with `eq_` and is shown once) and export it:

```bash
export EQUIBLES_API_KEY=eq_your_api_key
```

Then pass the server URL and the key to `MCPClient`:

```python
import os

from strands import Agent
from strands.tools.mcp import MCPClient

equibles = MCPClient(
    url="https://mcp.equibles.com/mcp",
    headers={"Authorization": f"Bearer {os.environ['EQUIBLES_API_KEY']}"},
)

with equibles:
    agent = Agent(tools=equibles.list_tools_sync())
    agent("Using Equibles, who are NVIDIA's top institutional holders? Include the reporting period.")
```

The `with` block keeps the MCP session open while the agent runs. To let Strands open and close the session itself, pass the client as a tool instead: `Agent(tools=[equibles])`.

## 3. Limit the tools the agent sees

The server exposes over 100 tools, and every tool description takes space in the model's context. Allow only the tools your agent needs, and add a prefix if it also has tools from other servers:

```python
equibles = MCPClient(
    url="https://mcp.equibles.com/mcp",
    headers={"Authorization": f"Bearer {os.environ['EQUIBLES_API_KEY']}"},
    tool_filters={
        "allowed": [
            "SearchDocuments",
            "ReadDocumentLines",
            "GetFinancialStatement",
            "GetEarningsCallTranscript",
            "GetInsiderTransactions",
            "GetTopHolders",
        ]
    },
    prefix="equibles",
)
```

The agent then sees six tools named `equibles_SearchDocuments`, `equibles_GetTopHolders` and so on; the server still receives the original names.

Most tools only read data. Portfolio, watchlist and feedback tools (`CreateMyPortfolio`, `AddPortfolioLot`, `WatchInstrument`, `ReportProblem` and their siblings) write to your own Equibles account, so leave them out of `allowed` unless the agent should manage your portfolios. The [tools reference](/docs/mcp/tools) lists every tool.

## 4. Call a tool without a model

To see what a tool returns before you wire it into an agent, call it through the client. This uses one request from your daily allowance and no model tokens:

```python
with equibles:
    result = equibles.call_tool_sync(
        tool_use_id="holders-1",
        name="GetTopHolders",
        arguments={"ticker": "NVDA", "maxResults": 3},
    )
    print(result["status"])
    print(result["content"][0]["text"])
```

`call_tool_sync` takes the server's tool name, without the prefix. The result is a Markdown table of holders with the 13F report date and a source link.

## Troubleshooting

**Connected but requests fail?** See [shared connection troubleshooting](/docs/authentication#connection-troubleshooting) for API-key errors.

**Tools load but every call fails?**

Listing tools works without a key, but calling one needs it. When no key reaches the server, each call comes back with `status` set to `error` and the text "Tool execution failed". Check that `EQUIBLES_API_KEY` is set and not empty in the shell that runs the agent.

**Connecting fails with a 401?**

The server rejected the key itself, before listing any tools. Check that `EQUIBLES_API_KEY` holds the full key you copied when you created it, not the shortened prefix the dashboard lists later, and that the key hasn't been deleted at [/dashboard/apikeys](/dashboard/apikeys).

**"the client session is not running"?**

A tool was listed or called outside the `with equibles:` block. Keep the agent inside the block, or pass the client itself with `Agent(tools=[equibles])`.

**Agent answers without Equibles data?**

The model answered from memory. Start the prompt with "using Equibles, ..." or narrow `allowed` to the tools the question needs. If you're over your daily limit, see [Plans & limits](/docs/rate-limits).