Route 1: the langchain-zambo package
The packaged route turns Zambo's MCP server into LangChain tools in one import. langchain-zambo (on PyPI, version 0.1.4) is a thin wrapper over langchain-mcp-adapters: it converts the tools served at https://zambo.dev/mcp into LangChain StructuredTool objects at runtime, over streamable HTTP, with no auth and no API key. Nothing is reimplemented in the package; the tools your agent receives are the server's own.
import asyncio
from langchain_zambo import get_zambo_tools
async def main():
tools = await get_zambo_tools() # Zambo MCP tools as LangChain tools, no API key
prices = [t for t in tools if "price" in t.name]
print("price tools:", [t.name for t in prices][:5])
asyncio.run(main())
From there the tools drop into a LangGraph agent like any others. The difference shows up after a call: every call returns its result plus a verifiable receipt, the record of that call captured by the server at execution time and published at a public URL. If you already run a MultiServerMCPClient, server_config() returns the Zambo server entry so you can merge it with your own servers instead of replacing your setup.
Route 2: the direct MCP pattern
The package is a convenience, not a requirement. Any LangChain or LangGraph agent that can use MCP tools can point langchain-mcp-adapters straight at https://zambo.dev/mcp and get the same behavior: calls execute on the server, and each one leaves a receipt because the executing layer makes the record. That is the general pattern behind MCP server receipts, and it works the same from any framework.
One habit completes the pattern: end multi-step jobs with workflow_close. The run's step receipts bind into a summary receipt with the steps as children and a single root digest over them, so the job you hand to a client, a reviewer, or your future self verifies as one sealed record, not a folder of separate claims.
Checking the run afterwards
- Per call: open the receipt URL and recompute the commitment from its canonical bytes, by hand or with the live verifier. A match means the saved record is the record made when the call ran.
- Per run: recompute the workflow root from the step receipt IDs and compare it with the summary receipt's root. A missing, added, or swapped step breaks it.
- As an audit: the receipts are the audit trail, countable and checkable after the fact. The method is written up in how to audit AI agent tool calls, and the verifier walkthrough runs the procedure against a real public receipt.
- Full days covered: a Day Pass ($0.99) keeps every call receipted for 24 hours, and sealed runs keep their page, verify badge, and PDF pack after the free viewing window.
LangChain execution receipts: FAQ
How do I add execution receipts to a LangChain agent?
Install the langchain-zambo package from PyPI and call get_zambo_tools(). It loads Zambo's MCP tools as LangChain StructuredTool objects at runtime (a thin wrapper over langchain-mcp-adapters, endpoint https://zambo.dev/mcp, streamable HTTP, no auth and no API key), and every call those tools make returns a verifiable receipt at a public URL. If you already manage MCP servers yourself, server_config() returns the Zambo entry to merge into your own MultiServerMCPClient. For multi-step jobs, finish with workflow_close so the run's step receipts bind into one sealed record with a single root.
Can I verify what my LangChain agent actually ran?
Yes, from the receipts instead of from the agent's messages. Each call made through the Zambo tools leaves a receipt recording the tool that ran, a hash of the arguments it was given, and the exact result bytes, committed under SHA-256 at execution time and published at a URL anyone can fetch. Recompute the commitment from the receipt's canonical bytes: a match means the saved record is the record made when the call ran. Work the agent describes but never executed has no receipt, so the gap between the story and the record is checkable rather than a matter of trust.
How do I audit a LangChain agent's tool calls?
Audit the receipts, not the transcript. Collect one receipt per tool call, recompute each receipt's commitment from its canonical bytes, recompute the workflow root over the run's step receipts to check the set as a whole, and for effects that matter read the outcome back in the system of record. Gaps in the sequence, a step whose bytes were edited, and calls the agent claims but cannot receipt all surface in the recompute. The full method, including how to count stall and bypass rates per model version from the record, is written up in how to audit AI agent tool calls.
What does a LangChain run receipt contain?
One receipt per tool call, in the AER-1 format: the tool name, a hash of the arguments the call received, the exact result bytes and their SHA-256 digest, and a timestamp, plus the canonical bytes a verifier recomputes to check the record. Each receipt is published at a public URL. When a run is closed with workflow_close, it also gets a summary receipt listing its step receipts as children and the single workflow root computed over them, so the whole run checks as a set instead of call by call. AER-1 is an open IETF Internet-Draft, so the format is public text anyone can implement or verify against.