Full-Time
Updated on 8/1/2026
Open-source framework for LLM-powered apps
No salary listed
London, UK
In Person
See people who can refer or advise you
LangChain provides an open-source framework for building applications powered by large language models (LLMs). It offers a modular toolkit with components like Model I/O, Data Connection, Chains, Agents, Memory, and Callbacks, allowing developers to create apps that can reason about and act on external data sources and APIs. The product works by letting users assemble chains of LLM calls, connect LLMs to data sources, enable agents to make decisions and use tools, persist state across interactions, and monitor activity through callbacks. This modular design differentiates LangChain from competitors by its emphasis on flexibility, extensibility, and open-source collaboration, enabling a wide range of users—from individuals to large enterprises—to tailor LLM-powered applications. The company's goal is to simplify the development and deployment of AI-powered applications, providing an adaptable framework that handles data integration, reasoning, and action for diverse use cases.
Company Size
201-500
Company Stage
Series B
Total Funding
$160M
Headquarters
San Francisco, California
Founded
2023
See people who can refer or advise you
Help us improve and share your feedback! Did you find this helpful?
Company Equity
MCP vs langchain: which should you choose? A detailed comparison of the protocol vs the framework for AI agent development. MCP and LangChain are often discussed as competing approaches to AI agent development. But they're fundamentally different things serving different purposes. This guide clarifies the distinction and helps you choose - or combine - them. The core misconception. MCP is a protocol. It defines how agents interact with tools. LangChain is a framework. It provides code for building agents. They're not mutually exclusive. LangChain actually includes MCP integration. Understanding this distinction is key to using both effectively. What each does. MCP handles. Agent | MCP Protocol | Tool Server * Tool discovery * Tool invocation * Schema validation * Transport (stdio, HTTP, WebSocket) * Standardized pricing and payments LangChain handles. User | LangChain Agent | [LLM, Memory, Tools, Prompts, Parsers] * Agent logic and orchestration * Prompt management * Memory systems * Output parsing * Tool chains * Document loaders * Vector store integration Feature comparison. | Feature | MCP | LangChain | | Type | Protocol (specification) | Framework (code library) | | Scope | Tool interaction | Full agent lifecycle | | Language | Any (SDKs for Python/JS) | Python, JavaScript | | Standardization | Universal | LangChain-specific | | Learning curve | Low | Medium-High | | Vendor lock-in | None | Medium | | Ecosystem | Growing rapidly | Mature | | Community | Open, multi-vendor | LangChain-centric | | Marketplace | SkillExchange, others | LangChain Hub | Using LangChain with MCP. LangChain has built-in MCP support: from langchain.agents import AgentExecutor, create_tool_calling_agent from langchain_openai import ChatOpenAI from langchain_mcp import MCPToolkit # Connect to MCP servers toolkit = MCPToolkit( servers=[ {"command": "node", "args": ["./db-server.js"]}, {"url": "https://api-mcp.example.com/sse"},]) # Get MCP tools as LangChain tools mcp_tools = await toolkit.get_tools # Mix MCP tools with native LangChain tools from langchain.tools import Tool all_tools = [*mcp_tools, # Tools from MCP servers Tool(name="calculator",...), # Native LangChain tool Tool(name="python_repl",...), # Another native tool] # Create agent with all tools llm = ChatOpenAI(model="gpt-4o") agent = create_tool_calling_agent(llm, all_tools, prompt) executor = AgentExecutor(agent=agent, tools=all_tools) When to Use MCP Only. Choose MCP-only (without LangChain) when: * Simple tool integration - Just need to connect a few tools to Claude or another MCP-compatible agent * Protocol-first architecture - You want maximum portability across agent platforms * Publishing tools - Building tools for SkillExchange or other marketplaces * Minimal dependencies - Don't want the LangChain dependency tree * Custom agent - You've built your own agent framework Example: MCP-Only Agent. from mcp import Client # Connect to MCP servers db_client = Client("https://db-mcp.example.com/sse") api_client = Client("https://api-mcp.example.com/sse") # Discover tools db_tools = await db_client.list_tools api_tools = await api_client.list_tools # Simple agent loop async def process(message): # Use LLM to decide which tool to use tool_choice = await llm.select_tool(message, [*db_tools, *api_tools]) # Execute via MCP if tool_choice: result = await tool_choice.client.call_tool( tool_choice.name, tool_choice.arguments) return result # Direct LLM response return await llm.complete(message) When to Use LangChain. Choose LangChain (with or without MCP) when: * Complex agent logic - Multi-step reasoning, conditional branching * Rich memory - Conversation summary, entity memory, knowledge graph * Document processing - Load, chunk, embed, and retrieve documents * Multiple LLM providers - Switch between OpenAI, Anthropic, Google * Production infrastructure - Tracing (LangSmith), evaluation, deployment Example: LangChain with MCP. from langchain.agents import AgentExecutor from langchain_openai import ChatOpenAI from langchain_mcp import MCPToolkit from langchain.memory import ConversationSummaryMemory from langchain.prompts import ChatPromptTemplate # MCP tools toolkit = MCPToolkit(servers=[{"url": "https://tools.example.com/sse"}]) tools = await toolkit.get_tools # Memory memory = ConversationSummaryMemory( llm=ChatOpenAI(model="gpt-4o-mini"), max_summary_length=200,) # Prompt prompt = ChatPromptTemplate.from_messages([ ("system", "You are a helpful assistant with access to tools."), ("placeholder", "{chat_history}"), ("user", "{input}"), ("placeholder", "{agent_scratchpad}"),]) # Agent llm = ChatOpenAI(model="gpt-4o") agent = create_tool_calling_agent(llm, tools, prompt) executor = AgentExecutor( agent=agent, tools=tools, memory=memory, verbose=True, max_iterations=10,) result = await executor.ainvoke({"input": "What's in our database?"}) Architecture patterns. Pattern 1: LangChain Agent + MCP tools. User | LangChain Agent | MCP Protocol | External Tools Best for: Complex agents that need external tools via standard protocol. Pattern 2: MCP-Only Agent. User | Custom Agent | MCP Protocol | External Tools Best for: Simple agents, maximum portability, minimal dependencies. Pattern 3: LangChain Only (No MCP). User | LangChain Agent | Direct Tool Calls Best for: Prototyping, internal tools, when portability doesn't matter. Pattern 4: MCP Server published for LangChain Users. Your MCP Server | SkillExchange | LangChain Users Import via MCPToolkit Best for: Tool developers who want to reach LangChain users. Migration path. From LangChain to MCP. If you want to make LangChain tools MCP-compatible: # Before: LangChain-only tool from langchain.tools import Tool def search_tool(query: str) -> str: return search_api.search(query) langchain_tool = Tool( name="search", description="Search the web", func=search_tool,) # After: MCP-compatible tool from mcp import Server server = Server("search-tools") @server.tool("search") async def search(query: str) -> dict: results = search_api.search(query) return {"content": [{"type": "text", "text": str(results)}]} # Works with LangChain AND every other MCP-compatible agent From MCP to LangChain. If you have MCP tools and want to use them in LangChain: from langchain_mcp import MCPToolkit toolkit = MCPToolkit(servers=[{"url": "https://your-mcp-server.com/sse"}]) tools = await toolkit.get_tools # Now use them as native LangChain tools agent = create_tool_calling_agent(llm, tools, prompt) Performance comparison. | Aspect | MCP-Only Agent | LangChain + MCP | LangChain Only | | Cold start | Fast (~0ms) | Slow (~500ms) | Slow (~500ms) | | Per-query overhead | Minimal | Framework overhead | Framework overhead | | Memory usage | Low | Higher | Higher | | Dependency size | ~5MB | ~50MB+ | ~50MB+ | | Flexibility | Protocol-level | Full framework | Full framework | Community and Ecosystem. | Aspect | MCP | LangChain | | Governed by | Open standard (Anthropic-initiated) | LangChain Inc. | | GitHub stars | 15K+ | 90K+ | | Contributors | 200+ | 2,000+ | | Documentation | Growing | Extensive | | Courses | Limited | Many available | | Job market | Growing rapidly | Established | Conclusion. MCP and LangChain aren't competitors - they're complementary. Use MCP to make your tools universally accessible. Use LangChain when you need a full-featured framework for building complex agents. For most production agents, the best approach is: LangChain for orchestration + MCP for tool access. Explore both MCP tools and LangChain integrations on SkillExchange. Enjoying this article? Get weekly insights on building and selling AI skills, MCP tools, and creator economics. Join 2,000+ AI builders and creators. No spam. Unsubscribe anytime. Get the free MCP Server handbook. 50+ pages of practical guides, code examples, and production-ready templates. * Complete MCP protocol reference * 15+ production-ready templates * Security best practices guide No spam. Unsubscribe anytime. SkillExchange respect your privacy.
Build durable chat memory for RAG using ScyllaDB and langchain. By Attila Tóth July 14, 2026 How to replace LangChain's in-memory chat history with ScyllaDB - so your RAG chatbot retains context across restarts and scales across replicas This post demonstrates how to integrate ScyllaDB Vector Search into your LangChain project for RAG use cases, as well as how to use ScyllaDB as a durable conversation memory within LangChain. Background. Large language models are trained on a fixed snapshot of the world. RAG patches that gap by retrieving relevant documents at query time and injecting them into the prompt. The pipeline has two phases: * Index: load documents, split them into chunks, embed each chunk, store embeddings in a vector store. * Retrieve & Generate: enrich and embed the user's question, find the nearest vectors (ANN search), pass the matching chunks as context to the LLM. But RAG alone is not enough. You still need to keep track of all inputs provided by the user. Persistent chat memory. LLMs are stateless. Every call starts with a blank slate unless you replay the conversation history. LangChain's BaseChatMessageHistory abstraction lets you plug in any backend as the storage layer for that history. The default in-memory implementation vanishes on process exit. A database-backed implementation survives restarts, scales across replicas, and lets you inspect or audit conversations later. That's where ScyllaDB comes in. ScyllaDB + LangChain. ScyllaDB is a NoSQL database optimized for high-throughput, low-latency workloads. Combined with LangChain, you can build reliable and always-on AI applications: * High availability: data is automatically replicated across nodes, so there is no single point of failure. The cluster continues serving reads and writes even if a node goes down. * Predictable P99 latency: ANN queries return results fast enough that retrieval doesn't dominate your chain's total latency. * Horizontal scalability: add nodes to the cluster to increase throughput without schema changes or downtime. * Built-in vector search: a native vector<float, N> type and HNSW index are created automatically in ScyllaDB. In this example, embeddings are generated locally with sentence-transformers (all-MiniLM-L6-v2, 384 dimensions). For production use, you can swap in OpenAI embeddings, Cohere, or any other provider supported by LangChain. In each conversation turn, the chatbot is reading data from ScyllaDB and then writing back into it using LangChain. Setup example. With the release of ScyllaDB 2026.2, you can now integrate LangChain with ScyllaDB seamlessly by reusing the existing Cassandra connector. Install dependencies. pip install langchain langchain-community \ sentence-transformers langchain-groq \ langchain-text-splitters cassio \ scylla-driver python-dotenv Environment variables. Copy demo/.env.example to demo/.env and fill in your credentials: # ScyllaDB Cloud SCYLLADB_CONTACT_POINTS=node-0.your-cluster.cloud.scylladb.com SCYLLADB_DATACENTER=AWS_US_EAST_1 SCYLLADB_USERNAME=scylla SCYLLADB_PASSWORD=your-password-here SCYLLADB_KEYSPACE=demo # Groq (LLM) GROQ_API_KEY=gsk_... Retrieve the contact points, datacenter name, username, and password from the Connect tab of your cluster in ScyllaDB Cloud. Connect to ScyllaDB Cloud. from cassandra.cluster import Cluster from cassandra.auth import PlainTextAuthProvider from cassandra.policies import DCAwareRoundRobinPolicy import cassio cluster = Cluster( contact_points=["node-0.your-cluster.cloud.scylladb.com"], auth_provider=PlainTextAuthProvider( "scylla", "your-password"), load_balancing_policy=DCAwareRoundRobinPolicy( local_dc="AWS_US_EAST_1"),) session = cluster.connect cassio.init(session=session, keyspace="demo") The cassio.init call registers the session and keyspace globally so all downstream integrations (the vector store and the chat history) pick it up without further configuration. Although cassio was originally built as a Cassandra integration, it is session-agnostic. It works with whatever driver session you hand it, so passing a session created by scylla-driver works just as well. Integrating ScyllaDB with LangChain vector store. As an example, consider a chatbot that ingests articles, answers questions using retrieved context, and preserves conversation history in the database. from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Cassandra loader = WebBaseLoader([ "https://docs.scylladb.com/stable/get-started/scylladb-basics.html", "https://docs.scylladb.com/stable/get-started/data-modeling/query-design.html",]) docs = loader.load chunks = RecursiveCharacterTextSplitter( chunk_size=500, chunk_overlap=50, ).split_documents(docs) embeddings = HuggingFaceEmbeddings( model_name="all-MiniLM-L6-v2") vectorstore = Cassandra( embedding=embeddings, table_name="rag_docs") vectorstore.add_documents(chunks) retriever = vectorstore.as_retriever( search_kwargs={"k": 4}) WebBaseLoader fetches and parses each URL into a Document. RecursiveCharacterTextSplitter then breaks each document into 500-token chunks with a 50-token overlap so sentences are not severed at boundaries. Cassandra(table_name="rag_docs") creates the table on first use, including a vector<float, 384> column (matching all-MiniLM-L6-v2's output dimensions) and an HNSW index. Subsequent runs reuse the existing table; you only pay the embedding cost once unless you call add_documents again. Persistent chat memory implementation. from langchain_community.chat_message_histories import CassandraChatMessageHistory def get_chat_history(session_id: str) -> CassandraChatMessageHistory: return CassandraChatMessageHistory( session_id=session_id, table_name="chat_history",) CassandraChatMessageHistory stores each message as a row keyed on session_id. Because rows are written to ScyllaDB, the history survives process crashes, server restarts, and horizontal scaling. Any replica that opens the same session_id sees the same history. Change session_id to start a fresh conversation. Keep it the same to resume where you left off - that is the entire persistence mechanism. Putting it together. from langchain_groq import ChatGroq from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.output_parsers import StrOutputParser from langchain_core.runnables import RunnablePassthrough from langchain_core.runnables.history import RunnableWithMessageHistory llm = ChatGroq(model="llama-3.3-70b-versatile") ablePassthrough from langchain_core.runnables.history import RunnableWithMessageHistory llm = ChatGroq(model="llama-3.3-70b-versatile") prompt = ChatPromptTemplate.from_messages([ ("system", "You are a helpful assistant. Answer the user's question using the " "retrieved context below.\n\nContext:\n{context}"), MessagesPlaceholder(variable_name="chat_history"), ("human", "{question}"),]) chain = (RunnablePassthrough.assign(context=lambda x: "\n\n".join( d.page_content for d in retriever.invoke(x["question"]))) | prompt | llm | StrOutputParser chain_with_history = RunnableWithMessageHistory( chain, get_chat_history, input_messages_key="question", history_messages_key="chat_history",) config = {"configurable": {"session_id": "user-abc-session-1"}} answer1 = chain_with_history.invoke( {"question": "What is the difference between a partition key and a clustering key in ScyllaDB?"}, config=config,) print(answer1) answer2 = chain_with_history.invoke( {"question": "How does using both keys affect the sort order of the data within a partition?"}, config=config,) print(answer2) # References the prior turn via memory RunnableWithMessageHistory wraps the chain and automatically loads prior turns from get_chat_history before each call, then appends the new turn after. Both storage operations hit ScyllaDB. The second question drills deeper into clustering columns introduced in the first answer. Without persistent memory, the LLM would have no context for what was already explained; with it, the conversation flows naturally across turns. ScyllaDB schema. rag_docs, the vector store: CREATE TABLE demo.rag_docs ( row_id text PRIMARY KEY, attributes_blob text, body_blob text, metadata_s map<text, text>, vector vector<float, 384>,); CREATE CUSTOM INDEX idx_vector_rag_docs ON demo.rag_docs (vector) USING 'vector_index'; CREATE INDEX eidx_metadata_s_rag_docs ON demo.rag_docs (ENTRIES(metadata_s)); chat_history, the message store: CREATE TABLE demo.chat_history (partition_id text, message_id timeuuid, body_blob text, PRIMARY KEY (partition_id, message_id)) WITH CLUSTERING ORDER BY (message_id DESC); Next steps. The full demo code is available on GitHub. You can run it once to ingest and embed the articles, then run it again with the same SESSION_ID to verify that prior conversation turns are loaded from the database. Resources: Post on the ScyllaDB Forum if you have questions!
LangChain releases openwiki: an open-source AI agent and CLI that writes and maintains your repo documentation. OpenWiki is a new open-source CLI from LangChain that automatically generates and maintains codebase documentation designed specifically for AI coding agents. AIDeveloper44 Team OpenWiki automates codebase documentation to give AI agents structured, retrievable context. * LangChain's OpenWiki is an open-source CLI that generates structured codebase wikis for AI coding agents. * It automatically updates files like AGENTS.md or CLAUDE.md to point agents to this documentation, replacing bloated context files with a retrieval model. * A built-in GitHub Action automates daily documentation updates via pull requests based on recent Git commits. * The tool supports multiple inference providers, custom gateway URLs, and optional LangSmith tracing. Introduction to OpenWiki. LangChain has released OpenWiki, an open-source command-line interface (CLI) tool designed to write and maintain documentation for codebases. Rather than generating standard documentation for human developers, OpenWiki targets AI coding agents. The tool constructs a structured knowledge base that coding agents can navigate, addressing the common problem of outdated or bloated agent instruction files. The problem with single-file instructions. In the current ecosystem of AI-assisted development, tools like Claude Code, Cursor, and OpenAI Codex rely on root-level markdown files - most notably AGENTS.md or CLAUDE.md - to understand project context. These files act as a persistent memory layer, providing the agent with coding standards, architectural guidelines, and project requirements. However, developers frequently overload these instruction files. Storing hundreds of pages of project history and architectural context in a single file severely inflates the agent's context window. When a large language model (LLM) processes a massive context file during every chat session, its ability to locate and adhere to specific, granular instructions diminishes. This approach increases API costs and degrades the agent's performance, as models struggle to consistently execute tasks when burdened with excessive, irrelevant context. The structured retrieval approach. OpenWiki implements an alternative architecture. Instead of centralizing all information into one instruction file, it creates a dedicated openwiki/ directory within the repository. This directory functions as a localized wiki, populated with summaries, structural maps, and cross-references organized specifically for an LLM's parsing capabilities. To connect this wiki to the coding agent, OpenWiki automatically updates the existing AGENTS.md or CLAUDE.md files. If these files do not yet exist, the CLI creates them. It then appends specific prompting instructions that direct the agent to search and reference the openwiki/ directory when it requires context. This shifts the agent's workflow from loading the entire repository context at startup to retrieving necessary documentation on demand. Source Codebase OpenWiki CLI LLM Processing openwiki/ Dir Structured Docs Context Pointers Agent Retrieves Diagram: OpenWiki analyzes the codebase to generate structured documentation and updates instruction files, allowing agents to retrieve context on demand. Static documentation becomes outdated quickly, which creates friction when agents rely on it. OpenWiki addresses this by offering continuous maintenance through a GitHub Action workflow. Developers can copy the provided openwiki-update.yml workflow file into their repository's .github/workflows/ directory. Configured to run on a daily schedule, this action executes the CLI in update mode (openwiki -update). The tool analyzes recent Git commits and file differences, identifies what parts of the codebase have changed, and rewrites the relevant wiki files. Following the update, the action automatically opens a pull request with the new documentation, ensuring a human can review the automated changes before they are merged. CLI usage and tracing. The CLI is installed globally via npm using the command npm install -g openwiki. Running openwiki -init begins an interactive setup process where the user configures their preferred model and API key. If an openwiki/ directory already exists, the initialization command refreshes the existing documentation based on repository changes rather than rebuilding it entirely from scratch. The tool offers multiple operational modes: * Interactive Mode: Running openwiki keeps the interface open for continuous prompt refinement. * Single Execution: The -p or -print flag allows for a one-shot, non-interactive run that prints the assistant's output and exits. * Update Mode: The -update flag refreshes documentation based on recent codebase changes. Additionally, OpenWiki supports optional integration with LangSmith. By providing a LangSmith API key during setup, developers can trace the underlying agent's execution paths while it generates documentation. This data is logged to a LangSmith project named "openwiki," allowing for performance auditing and debugging. Provider flexibility and gateway support. OpenWiki is designed to be provider-agnostic. Out of the box, it supports OpenRouter, Fireworks, Baseten, OpenAI, Anthropic, and generic OpenAI-compatible providers. The system includes pre-defined configurations for several current LLMs (such as GLM 5.2, Kimi K2.6, and Sonnet 5). Users can also specify custom model IDs based on their own requirements. For organizations utilizing self-hosted models, proxies, or API gateways (such as a LiteLLM gateway), OpenWiki allows custom endpoint routing. Users can define alternative base URLs, such as ANTHROPIC_BASE_URL or OPENAI_COMPATIBLE_BASE_URL, alongside their API keys. All configuration settings and secrets are saved locally on the user's machine in a ~/.openwiki/.env file. References & Sources
Give your LangChain agent a real inbox. June 13, 2026 AgentMail ships an official LangChain integration. One pip install gives any LangGraph agent its own inbox to send from, reply in, search, and react to. Engineering integrations developer-resources AgentMail's official LangChain integration is live. One pip install gives any LangGraph agent its own inbox it can send from, reply in, search, and react to. The problem. Your agent can reason and call tools, but it can't receive anything. That's fine until it hits the real world. The agent tries to sign up for a service and the confirmation email goes nowhere. It needs an OTP and there's no inbox to read it from. Someone replies to a message it sent and the reply vanishes. Most "email for agents" is send-only (SendGrid, Mailgun, raw SMTP), which covers the easy half. The half that matters is receiving: catching the verification code, reading the reply, reacting to what lands. You can build that yourself. Stand up an IMAP client, parse MIME, dedupe threads, verify webhook signatures, keep an address alive across runs. That's a few hundred lines of plumbing before your agent sends its first email. Why langchain. You already build the agent here. LangChain is the default framework for wiring up tools, memory, and control flow, and LangGraph is where you run the multi-step logic. You're not looking for a new place to write agent code. You have one. What you want is for the inbox to show up as tools inside the graph you already have. Why AgentMail. AgentMail is an inbox as an API. One call gives an agent its own address that can send and receive. The address persists across runs, so an agent that gets logged out signs back in instead of starting over. A webhook fires the moment a message arrives, so you react to inbound mail instead of polling for it. The receive side is the point. It's what lets an agent get through a signup wall, read its own OTP, and pick a thread back up next week. Why the union matters. langchain-agentmail wraps the AgentMail SDK as standard LangChain tools, plus a document loader and a retriever. The plumbing from the first section (IMAP, MIME parsing, threading, webhook verification) is gone. You install the package and the inbox becomes a toolkit your LangGraph agent already knows how to call. pip install langchain-agentmail export AGENTMAIL_API_KEY="your-api-key" What you can do with it. Give agents their own inboxes. Provision a dedicated address per agent so it can send and receive on its own. The toolkit hands the model one tool per operation: create an inbox, list and read threads, send, reply, label, draft. Triage and reply. Read recent threads, summarize what's new, and reply inside the same thread with the right In-Reply-To headers. Hand the whole toolkit to a ReAct agent and that's a few lines: from langchain.chat_models import init_chat_model from langgraph.prebuilt import create_react_agent from langchain_agentmail import AgentMailToolkit model = init_chat_model(model="claude-sonnet-4-6", model_provider="anthropic") agent = create_react_agent(model, AgentMailToolkit.from_api_key.get_tools response = agent.invoke({ "messages": [("user", "Check my inbox for anything new. Summarize the most recent thread in 2 sentences.",)]}) Stage and schedule sends. Use the draft tools to compose iteratively, revise, and ship, or set a delivery time with send_at: from langchain_agentmail import AgentMailCreateDraftTool AgentMailCreateDraftTool.invoke({ "inbox_id": "ib_...", "to": "[email protected]", "subject": "Following up", "text": "Circling back on this.", "send_at": "2026-06-20T09:00:00Z", # omit to send on demand}) RAG over email. Load messages as LangChain Documents and index them into a vector store for semantic search across the inbox. A bundled retriever does keyword search with no embeddings: from langchain_agentmail import AgentMailLoader, AgentMailRetriever docs = AgentMailLoader(inbox_id="ib_...", labels=["inbox"], limit=50).load retriever = AgentMailRetriever(inbox_id="ib_...", k=5) hits = retriever.invoke("invoice") And to react to inbound mail instead of polling, the webhooks extra ships a FastAPI router with signature verification built in: from fastapi import FastAPI from langchain_agentmail.webhooks import AgentMailEvent, create_fastapi_router async def on_event(event: AgentMailEvent) -> None: if event.event_type == "message.received": # drive your LangGraph agent here... app = FastAPI app.include_router(create_fastapi_router(on_event), prefix="/agentmail") Try it. pip install langchain-agentmail The reference is on the LangChain docs, the package is on PyPI, and the source is on GitHub. Give the agent you already built an inbox and see what it does with it. AgentMail gives your agents real inboxes. Create inboxes via API. Send and receive Emails with 0 complexity. Free to start.
Previewing Interrupt 2026: agents at enterprise scale. This year, Langchain is doing it again. Interrupt 2026 is May 13-14 at The Midway in San Francisco, and the lineup, the format, and the scale have all leveled up. Last May, 800 of you came to The Midway in San Francisco for the inaugural Interrupt conference. Teams from Cisco, Uber, J.P. Morgan, Replit, LinkedIn, and BlackRock got on stage and told the truth about what it actually takes to put agents in production. Langchain launched LangSmith Deployment, shipped a redesigned LangSmith Studio, and rolled out new observability tools in LangSmith. If you were there, you know the energy. If you weren't, here's a taste of what you missed: This year, Langchain is doing it again. Interrupt 2026 is May 13-14 at The Midway in San Francisco, and the lineup, the format, and the scale have all leveled up. 2026 is about agents at enterprise scale. Last year's question was "can agents work in production?" The answer, across dozens of talks, was a definitive yes. This year's question is different: how do you make them work at enterprise scale - and what does the team, the tooling, and the infrastructure look like when agents aren't a proof of concept anymore? Interrupt 2026 is about the how. How are the largest companies in the world building agent platforms? How are they evaluating performance when the stakes are high? How are they structuring teams around agent engineering as a discipline? And how is the ecosystem - from model providers to infrastructure - evolving to support what comes next? Keynotes and fireside chats with. Harrison Chase, Co-founder and CEO of LangChain, will open each day of Interrupt with a keynote on what Langchain has learned from working with thousands of teams shipping agents over the past year, where its products are headed, and predictions about the industry. Andrew Ng, founder of DeepLearning.AI and one of the most influential voices in AI, will share his view on what's coming next for agents, and what it means for the developers and teams building them today. Chirantan "CJ" Desai, CEO of MongoDB, will sit down with Harrison for a fireside chat on how the world's largest enterprises are building with agents, and what the data layer looks like when agents move from experiments to production systems. Aaron Levie, Co-founder and CEO of Box, the intelligent content management platform he launched in 2005 is a vocal advocate for AI-driven enterprise software and frequently writes and speaks on how organizations can use AI agents to transform workflows. What you'll hear from the stage. Langchain is bringing teams who are deep in production and running agents at real scale with real consequences. Here's a preview of what's on the agenda: Lyft is talking about evals and how they are building evals around their specific product policies, user flows, and edge cases with LangSmith. Nick Ung from Lyft's Safety and Customer Care team will walk through how they built an evaluation system that actually tells them whether their agents are working, and how they close the feedback loop between failed traces, their ops team, and engineering. Apple is sharing how they built a low-code agent platform serving 15,000+ employees. Their team rethought how LangGraph constructs graphs at runtime to support dynamic, low-code agent building at a scale that required rearchitecting assumptions about graph construction, caching, and context management. LinkedIn is presenting a solution to one of the biggest problems today: recruiting. Recruiting is one of the most time-intensive workflows in any organization - especially for small and mid-size businesses without dedicated hiring teams. LinkedIn's engineering team tackled this head-on by building an AI recruiting agent with LangSmith and LangGraph. Now thanks to their recruiting agent, the team is hiring 10x faster. You'll also hear production stories from the world's largest enterprises including Toyota, LATAM Airlines, and Honeywell, along with tech-native companies including Coinbase, Chime, Rippling, monday.com, and Clay. Beyond the talks. Interrupt hosts two full days designed around learning, building, and connecting. AMAs with product leaders. Sit down with its engineers building LangSmith, Deep Agents, LangGraph, and LangChain. Ask them anything - about the roadmap, about your architecture, about the problem you've been stuck on for weeks. Last year's product announcements came out of conversations exactly like these, and Langchain expect this year to be no different. Demo stations. Get hands-on with the latest across the LangSmith platform. The demo area spans the entire front patio and serves as the central hub of the conference, a place to see what's new, try things out, and talk to the engineers who built them. Workshops. Go deeper with hands-on sessions led by LangChain engineers. Langchain'll cover topics like building Deep Agents, as well as improving agents using LangSmith Align Evals and Insights Agent. These are designed to be practical. Bring your laptop and leave with tactics you can actually use. Time with speakers. One of the best parts of last year was the hallway conversations. This year Langchain has built even more space for that. You'll be able to meet with many speakers after their talks at its Ask Me Anything booth. Get your ticket. Interrupt 2026. May 13-14. The Midway, San Francisco. Langchain sold out last year and expect to again.