lc2mcp
](https://pypi.org/project/lc2mcp/) ](https://pypi.org/project/lc2mcp/) 
将LangChain工具转换为FastMCP工具——只需一行代码。
停止重写你的工具。只是适应他们。
lc2mcp 是一个轻量级的适配器,可以转换现有的 LangChain工具 进入 FastMCP工具,使您能够快速构建可供Claude、Cursor和任何MCP兼容客户端访问的MCP服务器。
______________________________________________________________________
✨ 特性
| 特性 | 描述 |
|---|---|
| 🔄 即时转换 | 一个函数调用,将任何LangChain工具转换为FastMCP工具 |
| 📦 生态系统接入 | 解锁1000多个LangChain社区工具(搜索、维基百科、SQL、API……) |
| 🎯 零沸点板 | 自动媒染剂→ JSON模式转换 |
| 🔐 上下文注入 | 将身份验证、用户信息和请求上下文传递给工具 |
| 📊 进度和记录 | 完全支持MCP进度通知和日志记录 |
| 🏷️ 命名空间支持 | 为工具名称添加前缀并自动处理冲突 |
______________________________________________________________________
🚀 快速开始
安装
pip install lc2mcp通往MCP的3条线路
from langchain_core.tools import tool
from fastmcp import FastMCP
from lc2mcp import register_tools
@tool
def get_weather(city: str) -> str:
"""Get current weather for a city."""
return f"Sunny, 25°C in {city}"
mcp = FastMCP("weather-server")
register_tools(mcp, [get_weather]) # ← That's it!
if __name__ == "__main__":
mcp.run()您的工具现在可供Claude、Cursor和任何MCP客户端使用。
刀具参数说明
要在MCP工具模式中包含参数描述,您有两个选项:
选项1:使用 parse_docstring=True (为简单起见,建议使用)
@tool(parse_docstring=True)
def get_weather(city: str, unit: str = "celsius") -> str:
"""Get current weather for a city.
Args:
city: The name of the city to query
unit: Temperature unit (celsius or fahrenheit)
"""
return f"Sunny, 25°C in {city}"选项2:使用 args_schema (建议用于复杂类型)
from pydantic import BaseModel, Field
class WeatherInput(BaseModel):
city: str = Field(description="The name of the city to query")
unit: str = Field(default="celsius", description="Temperature unit")
@tool(args_schema=WeatherInput)
def get_weather(city: str, unit: str = "celsius") -> str:
"""Get current weather for a city."""
return f"Sunny, 25°C in {city}"注: 没有parse_docstring=True或args_schema,将不会提取文档字符串中的参数描述。
______________________________________________________________________
🔌 运作原理
┌─────────────────┐ ┌─────────────┐ ┌─────────────────┐
│ LangChain Tool │ ───▶ │ lc2mcp │ ───▶ │ FastMCP Tool │
│ (@tool, etc.) │ │ (adapter) │ │ │
└─────────────────┘ └─────────────┘ └────────┬────────┘
│
▼
┌─────────────────┐
│ FastMCP Server │
└────────┬────────┘
│
▼
┌───────────────────────┐
│ MCP Clients │
│ (Claude, Cursor, ...) │
└───────────────────────┘______________________________________________________________________
🔄 lc2mcp与langchain mcp适配器
LangChain和MCP生态系统可以连接 双向:
| 方向 | 工具 | 描述 |
|---|---|---|
| LangChain→ MCP | lc2mcp ✅ | 将LangChain工具转换为MCP工具(本项目) |
| MCP → LangChain | langchain-mcp-adapters | 将MCP工具转换为LangChain工具(官方) |
何时使用 lc2mcp:
- 您有现有的LangChain工具,并希望通过MCP公开它们
- 您想使用LangChain丰富的工具生态系统构建MCP服务器
- 您需要为Claude、Cursor或其他MCP客户端提供工具
何时使用 langchain-mcp-adapters:
- 您有MCP服务器,并希望在LangChain代理中使用它们
- 您想从LangGraph工作流调用MCP工具
两者结合使用:
┌─────────────────────────────────────────────────────────────────┐
│ Your Application │
├─────────────────────────────────────────────────────────────────┤
│ │
│ LangChain Tools ──── lc2mcp ────▶ MCP Server ──▶ MCP Clients │
│ │ │ (Claude, etc) │
│ │ │ │
│ ▼ ▼ │
│ LangChain Agent ◀── langchain-mcp-adapters ─── MCP Tools │
│ │
└─────────────────────────────────────────────────────────────────┘这两个库是互补的,可以一起用来构建连接LangChain和MCP生态系统的强大AI应用程序。
______________________________________________________________________
📚 例子
使用社区工具
立即将DuckDuckGo搜索和维基百科暴露给MCP客户端:
pip install lc2mcp langchain-community duckduckgo-search wikipediafrom fastmcp import FastMCP
from langchain_community.tools import DuckDuckGoSearchRun, WikipediaQueryRun
from langchain_community.utilities import WikipediaAPIWrapper
from lc2mcp import register_tools
mcp = FastMCP("knowledge-server")
register_tools(mcp, [
DuckDuckGoSearchRun(),
WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper()),
])
if __name__ == "__main__":
mcp.run()使用身份验证上下文
将用户身份验证和应用程序上下文注入到您的工具中:
from dataclasses import dataclass
from fastmcp import Context, FastMCP
from langchain_core.tools import tool
from langgraph.prebuilt import ToolRuntime
from lc2mcp import register_tools
@dataclass(frozen=True)
class UserContext:
user_id: str
tenant_id: str
@tool
def whoami(runtime: ToolRuntime[UserContext]) -> str:
"""Return the current user."""
return f"Hello, user {runtime.context.user_id} from {runtime.context.tenant_id}"
def runtime_adapter(mcp_ctx: Context) -> ToolRuntime[UserContext]:
return ToolRuntime(
context=UserContext(
user_id=mcp_ctx.get_state("user_id") or "anonymous",
tenant_id=mcp_ctx.get_state("tenant_id") or "default",
),
state={}, config={}, stream_writer=lambda x: None,
tool_call_id=None, store=None,
)
mcp = FastMCP("auth-server")
register_tools(mcp, [whoami], runtime_adapter=runtime_adapter)
if __name__ == "__main__":
mcp.run()带有进度报告和记录功能
使用MCP上下文进行实时进度更新和记录:
from fastmcp import Context, FastMCP
from langchain_core.tools import tool
from lc2mcp import register_tools
@tool
async def process_data(data: str, mcp_ctx: Context) -> str:
"""Process data with progress reporting."""
await mcp_ctx.info(f"Starting: {data}")
await mcp_ctx.report_progress(0, 100, "Starting")
# ... processing steps ...
await mcp_ctx.report_progress(50, 100, "Processing")
await mcp_ctx.info("Complete!")
await mcp_ctx.report_progress(100, 100, "Done")
return f"Processed: {data}"
mcp = FastMCP("processor")
register_tools(mcp, [process_data], inject_mcp_ctx=True)
if __name__ == "__main__":
mcp.run()命名空间和冲突处理
使用前缀组织工具并处理名称冲突:
from fastmcp import FastMCP
from lc2mcp import register_tools
mcp = FastMCP("multi-domain")
# Prefix all finance tools
register_tools(mcp, finance_tools, name_prefix="finance.")
# Auto-suffix on collision: tool → tool_2 → tool_3
register_tools(mcp, ops_tools, name_prefix="ops.", on_name_conflict="suffix")
if __name__ == "__main__":
mcp.run()______________________________________________________________________
📖 api参考
register_tools()
在服务器上将LangChain工具转换并注册为FastMCP工具。
register_tools(
mcp: FastMCP,
tools: list[BaseTool | Callable],
*,
name_prefix: str | None = None, # e.g. "finance." → "finance.get_stock"
on_name_conflict: str = "error", # "error" | "overwrite" | "suffix"
inject_mcp_ctx: bool = False, # inject mcp_ctx: Context
runtime_adapter: Callable | None = None, # Context → ToolRuntime[...]
)to_mcp_tool()
将单个LangChain工具转换为FastMCP工具进行手动注册。
to_mcp_tool(
tool: BaseTool | Callable,
*,
name: str | None = None,
description: str | None = None,
args_schema: Type[BaseModel] | None = None,
inject_mcp_ctx: bool = False,
runtime_adapter: Callable | None = None,
) -> Callable______________________________________________________________________
🔧 兼容性
| 组件 | 支持的版本 |
|---|---|
| Python | 3.10、3.11、3.12+ |
| 郎链 | >=1.0.0 |
| FastMCP | >=2.0.0 |
工具支持
| 工具类型 | 状态 |
|---|---|
@tool 装饰功能 | ✅ 全力支持 |
@tool(parse_docstring=True) | ✅ 完全支持(带参数说明) |
@tool(args_schema=...) | ✅ 完全支持(带参数说明) |
StructuredTool | ✅ 全力支持 |
BaseTool 子类 | ✅ 支持(需要 args_schema) |
______________________________________________________________________
🤝 贡献
欢迎投稿!请随时提交拉取请求。
______________________________________________________________________
📄 许可证
MIT许可证-请参阅 许可证 了解详情。
______________________________________________________________________
Made with ❤️ for the LangChain and MCP communities
