Drop live, verifiable data into your agent framework.
One keyless MCP service, with a full public catalogue and focused collections. Copy-paste recipes for nine frameworks, all using the same Streamable HTTP transport. The MCP service needs no key; only the LLM you drive does.
All nine speak MCP natively.
Every framework below has first-class MCP support, so connecting is just pointing it at the remote server https://dynamicfeed.ai/mcp (streamable HTTP, keyless) and loading its tools. Each recipe is verified against the framework's current release. Pick yours, copy, run.
Keep https://dynamicfeed.ai/mcp when an agent needs the full public catalogue. For a narrower job, replace the URL in any recipe with /mcp/security, /mcp/weather, /mcp/space, /mcp/infrastructure, /mcp/ai-models or /mcp/evidence.
Why scope it? A smaller catalogue sends fewer tool descriptions into the model context. That can reduce prompt-token use and tool-selection ambiguity. Every collection is an allow-listed filter over the canonical registry, not a copied server.
▸ LangChain & LangGraph
Use langchain-mcp-adapters, MultiServerMCPClient loads the remote tools as native LangChain tools for any agent or LangGraph node.
pip install langchain-mcp-adapters langgraph "langchain[anthropic]"
import asyncio
from langchain_mcp_adapters.client import MultiServerMCPClient
from langgraph.prebuilt import create_react_agent
async def main():
# Keyless remote MCP server over streamable HTTP, no auth, no local process.
client = MultiServerMCPClient({
"dynamicfeed": {
"transport": "streamable_http", # "http" / "streamable-http" also accepted
"url": "https://dynamicfeed.ai/mcp",
}
})
tools = await client.get_tools() # full public catalogue
agent = create_react_agent("anthropic:claude-sonnet-4-6", tools)
resp = await agent.ainvoke(
{"messages": [{"role": "user", "content": "What is the weather in Sydney?"}]}
)
print(resp["messages"][-1].content)
if __name__ == "__main__":
asyncio.run(main())
▸ LlamaIndex
Use llama-index-tools-mcp, BasicMCPClient + McpToolSpec turn the remote server into a tool list for a FunctionAgent.
pip install llama-index-tools-mcp llama-index-llms-openai llama-index-core
import asyncio
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
async def main():
# A URL ending in /mcp auto-selects Streamable HTTP. Keyless.
client = BasicMCPClient("https://dynamicfeed.ai/mcp")
tools = await McpToolSpec(client=client).to_tool_list_async() # full catalogue
agent = FunctionAgent(
tools=tools,
llm=OpenAI(model="gpt-4.1"), # set OPENAI_API_KEY
system_prompt="You have live, verifiable data tools.",
)
print(str(await agent.run("What is the weather in Sydney?")))
if __name__ == "__main__":
asyncio.run(main())
▸ CrewAI
Use crewai-tools[mcp], MCPServerAdapter discovers the remote tools and hands them to your Agent. Build and run the crew inside the with block.
pip install 'crewai-tools[mcp]' crewai
from crewai import Agent, Task, Crew, Process
from crewai_tools import MCPServerAdapter
# "transport" is a KEY inside the dict (not a kwarg). Keyless: no headers.
server_params = {"url": "https://dynamicfeed.ai/mcp", "transport": "streamable-http"}
with MCPServerAdapter(server_params, connect_timeout=60) as mcp_tools:
agent = Agent(
role="Live-data analyst",
goal="Answer using fresh, verifiable data from Dynamic Feed.",
backstory="Wired to a remote MCP feed of real-time, sourced data.",
tools=mcp_tools, # full catalogue (or use a collection URL)
llm="anthropic/claude-opus-4-8", # set ANTHROPIC_API_KEY
)
task = Task(
description="Current weather in Sydney? Cite the source and timestamp.",
expected_output="Conditions with source and measured_at.",
agent=agent,
)
print(Crew(agents=[agent], tasks=[task], process=Process.sequential).kickoff())
▸ Pydantic-AI
Native MCP support, MCPServerStreamableHTTP is a toolset you attach straight to an Agent. Note the class name: one word, capital HTTP.
pip install "pydantic-ai-slim[mcp]"
import asyncio
from pydantic_ai import Agent
from pydantic_ai.mcp import MCPServerStreamableHTTP
# Keyless remote MCP server over Streamable HTTP.
server = MCPServerStreamableHTTP("https://dynamicfeed.ai/mcp")
agent = Agent("anthropic:claude-opus-4-8", toolsets=[server])
async def main():
async with agent: # opens MCP connections once
result = await agent.run("What is the weather in Sydney?")
print(result.output)
if __name__ == "__main__":
asyncio.run(main())
▸ Vercel AI SDK
AI SDK v6: the MCP client moved to @ai-sdk/mcp (createMCPClient). Adapt the remote tools, then pass them to generateText.
npm i ai @ai-sdk/mcp @ai-sdk/anthropic @modelcontextprotocol/sdk zod
import { createMCPClient } from '@ai-sdk/mcp';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { generateText, stepCountIs } from 'ai';
import { anthropic } from '@ai-sdk/anthropic';
// Keyless remote streamable-HTTP transport, no headers needed.
const transport = new StreamableHTTPClientTransport(new URL('https://dynamicfeed.ai/mcp'));
const mcp = await createMCPClient({ transport });
try {
const tools = await mcp.tools(); // adapts the full public catalogue
const { text } = await generateText({
model: anthropic('claude-opus-4-8'),
tools,
stopWhen: stepCountIs(5), // allow multi-step tool calls
prompt: 'Get the current AI model pricing and the latest CVEs.',
});
console.log(text);
} finally {
await mcp.close();
}
▸ OpenAI Agents SDK
Native MCP support, MCPServerStreamableHttp as an async context manager; the SDK auto-lists the remote tools and hands them to your Agent.
pip install openai-agents
import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
async def main():
# Keyless remote MCP over streamable HTTP, params needs only the URL.
async with MCPServerStreamableHttp(
name="Dynamic Feed",
params={"url": "https://dynamicfeed.ai/mcp"},
cache_tools_list=True, # cache the discovered catalogue
) as df:
agent = Agent(
name="Assistant",
instructions="Answer with fresh, verifiable data from Dynamic Feed.",
model="gpt-4.1", # set OPENAI_API_KEY
mcp_servers=[df],
)
result = await Runner.run(agent, "What is the weather in Sydney?")
print(result.final_output)
if __name__ == "__main__":
asyncio.run(main())
▸ Microsoft Agent Framework
The unified AutoGen + Semantic Kernel successor, MCPStreamableHTTPTool attaches straight to a ChatAgent. (Pre-release: install with --pre.)
pip install agent-framework --pre
import asyncio
from agent_framework import ChatAgent, MCPStreamableHTTPTool
from agent_framework.openai import OpenAIChatClient
async def main():
# Keyless remote MCP, just name + url, no headers.
async with (
MCPStreamableHTTPTool(name="Dynamic Feed", url="https://dynamicfeed.ai/mcp") as df,
ChatAgent(
chat_client=OpenAIChatClient(model_id="gpt-4o-mini"), # set OPENAI_API_KEY
name="LiveDataAgent",
instructions="Answer with fresh, sourced data from Dynamic Feed.",
tools=df,
) as agent,
):
result = await agent.run("What is the current AQI in Sydney?")
print(result.text)
if __name__ == "__main__":
asyncio.run(main())
▸ Google ADK
Agent Development Kit, McpToolset with StreamableHTTPConnectionParams on the remote URL, attached to an LlmAgent (runs on Gemini).
pip install google-adk
import asyncio
from google.adk.agents import LlmAgent
from google.adk.runners import Runner
from google.adk.sessions import InMemorySessionService
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams
from google.genai import types
# Keyless remote MCP over streamable HTTP, no headers.
toolset = McpToolset(
connection_params=StreamableHTTPConnectionParams(url="https://dynamicfeed.ai/mcp")
)
agent = LlmAgent(
model="gemini-flash-latest", # set GOOGLE_API_KEY
name="dynamicfeed_agent",
instruction="Answer using the live Dynamic Feed tools.",
tools=[toolset], # auto-discovers the public catalogue
)
async def main():
sessions = InMemorySessionService()
await sessions.create_session(app_name="df", user_id="u1", session_id="s1")
runner = Runner(app_name="df", agent=agent, session_service=sessions)
msg = types.Content(role="user", parts=[types.Part(text="Weather in Sydney?")])
async for ev in runner.run_async(user_id="u1", session_id="s1", new_message=msg):
if ev.is_final_response() and ev.content:
print(ev.content.parts[0].text)
if __name__ == "__main__":
asyncio.run(main())
▸ Mastra
TypeScript, MCPClient with a bare url (tries Streamable HTTP, falls back to SSE); listTools() feeds the Agent.
npm install @mastra/mcp @mastra/core
import { MCPClient } from "@mastra/mcp";
import { Agent } from "@mastra/core/agent";
// Keyless remote MCP, a bare url tries Streamable HTTP first.
const mcp = new MCPClient({
servers: { dynamicfeed: { url: new URL("https://dynamicfeed.ai/mcp") } },
});
const tools = await mcp.listTools(); // namespaced public catalogue
const agent = new Agent({
name: "Dynamic Feed Agent",
instructions: "Answer using live Dynamic Feed tools; cite source + timestamp.",
model: "openai/gpt-4o", // set OPENAI_API_KEY
tools,
});
const res = await agent.generate("Latest published OpenAI model and its price?");
console.log(res.text);
await mcp.disconnect();
The server is keyless; your LLM is not. Connecting to https://dynamicfeed.ai/mcp needs no key or signup. The agent's model (Anthropic, OpenAI, …) still needs its own provider key, swap the model id in any snippet for whatever you have.
Transport spelling drifts by framework. LangChain wants streamable_http (underscore), CrewAI wants streamable-http (hyphen) as a dict key, Pydantic-AI uses the MCPServerStreamableHTTP class, and LlamaIndex infers it from the /mcp URL. The snippets above already use the correct form for each.
Use the full catalogue to explore; scope production agents where practical. A collection URL applies a centrally maintained allow-list before tool discovery, so the model receives only the relevant tool descriptions.
Live data it can verify.
Broad
a current public catalogue across weather, GPS integrity, CVEs, maritime, space and more
Signed
successful responses carry provenance and a signed integrity envelope that anyone can check
Keyless
no signup to connect or use the free tier, point your framework at the endpoint and go
A successful tool response carries source and timing metadata plus a signed integrity envelope. See how to check one at /proof, browse the current catalogue at /feeds, or read the full reference in the docs.
A valid signature confirms response integrity and issuer identity. Source accuracy must still be evaluated under the applicable trust policy. Independent time evidence is shown only when a separate timestamp proof has actually been validated.
Two calls your agent can prove later.
Beyond reading live data, agents leave evidence with two endpoints: /v1/facts returns any reading in one canonical, signed shape, and /v1/anchor time-stamps a hash of it with an independent RFC 3161 authority. Hashes only, never your data.
# Sign + RFC 3161 timestamp the exact market reading your algo acted on.
# You pass the reading; only its SHA-256 is timestamped (hashes only, never data).
curl -s -X POST https://dynamicfeed.ai/v1/anchor \
-H 'Content-Type: application/json' \
-d '{"snapshot":{"order_id":"NSE-2026-0001","instrument":"RELIANCE",
"price":2945.5,"acted_at":"2026-06-28T06:30:00Z"}}'
# -> {"digest_sha256":"d690e787…","tsa":"rfc3161","status":"confirmed",
# "timestamp_token_b64":"…","signature":{…}} # independently verifiable later
India's trace-to-source rule (mandatory from 1 April 2026) means proving the exact datapoint an order acted on. Dynamic Feed is the neutral third party that signs and timestamps it, independent of the desk. See the worked demo at SEBI algo evidence. We witness the datapoint; we never supply the price or touch the order.
# 1) Capture the external input your decision used, as one signed, canonical fact.
curl -s "https://dynamicfeed.ai/v1/facts?tool=current_weather&city=Mumbai&country=IN"
# 2) Timestamp that fact's hash so the record holds up in discovery months later.
curl -s -X POST https://dynamicfeed.ai/v1/anchor \
-H 'Content-Type: application/json' \
-d '{"snapshot":{"fact":"current_weather","city":"Mumbai",
"value":31.2,"unit":"C","at":"2026-06-28T06:30:00Z"}}'
When an automated decision is contested, the question is what data it acted on, and when. An engine cannot witness itself; Dynamic Feed is the independent party that signs and timestamps the external data, re-checkable by a court or a regulator. See AI decision evidence.
Dynamic Feed is an independent evidence layer, not legal advice and not a compliance certification of anyone's AI or trading. Signing and timestamping prove a record existed unchanged at a time, they do not prove the value is objectively true. We never supply finance prices, place or execute trades, or touch the money path. Treat it as one independent, verifiable input.
Now give your agent the real world.
Browse the current public catalogue, connect an IDE in one click, or verify a signature yourself.
Access policy
| Interface | Endpoint | Access | Use | Limit |
|---|---|---|---|---|
| MCP | /mcp | Keyless | Public read-only access | No per-key quota; subject to service availability |
| REST batch | /v1/batch | Keyless | Testing and low-volume read-only batch access | Maximum 20 calls per request |
| Direct REST | Documented keyed routes | X-API-Key | Direct endpoint access with usage accounting | Plan quota applies |
| x402 | /v1/pro/* | x402 payment | Machine-paid access on eligible premium endpoints | Per-call terms are returned with HTTP 402 |
| Enterprise | /enterprise | Commercial terms | Discuss operating, support, and integration requirements | Published or agreed service terms apply |