Strands Agents 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
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 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 (it starts with eq_ and is shown once) and export it:
export EQUIBLES_API_KEY=eq_your_api_key
Then pass the server URL and the key to MCPClient:
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:
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 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:
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 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.
"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.