+
104
-

回答

3、fastapi-mcp

from fastapi import FastAPI
from fastapi_mcp import FastApiMCP  
app = FastAPI()
FastApiMCP(app).mount()  # MCP服务即刻生效!

4、langchain

import asyncio
import pathlib
import sys
import typing as t

from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from langchain_core.output_parsers import StrOutputParser
from langchain_core.tools import BaseTool
from langchain_groq import ChatGroq
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

from langchain_mcp import MCPToolkit

async def run(tools: list[BaseTool], prompt: str) -> str:
    # 注意:原文使用了Groq,但为了更通用,这里可以替换为 OpenAI 或其他模型
    # model = ChatGroq(model_name="llama-3.1-8b-instant", stop_sequences=None) 
    # 假设您已设置 OPENAI_API_KEY 环境变量
    from langchain_openai import ChatOpenAI
    model = ChatOpenAI(model="gpt-4o-mini") # 使用 OpenAI 模型示例

    tools_map = {tool.name: tool for tool in tools}
    tools_model = model.bind_tools(tools)
    messages: list[BaseMessage] = [HumanMessage(prompt)]
    ai_message = t.cast(AIMessage, await tools_model.ainvoke(messages))
    messages.append(ai_message)
    for tool_call in ai_message.tool_calls:
        # LangChain 工具名称通常是小写的
        selected_tool = tools_map[tool_call["name"].lower()] 
        tool_msg = await selected_tool.ainvoke(tool_call["args"]) # 传递参数
        messages.append(tool_msg) # 应为 ToolMessage 类型,但此处简化处理
        # 注意:更完整的实现需要创建 ToolMessage
        # from langchain_core.messages import ToolMessage
        # tool_msg = ToolMessage(content=..., tool_call_id=tool_call['id'])

    # 再次调用模型以获得最终的自然语言响应
    return await (tools_model | StrOutputParser()).ainvoke(messages)

async def main(prompt: str) -> None:
    server_params = StdioServerParameters(
        command="npx",
        # 确保您已全局安装或 npx 可以找到此包
        args=["-y", "@modelcontextprotocol/server-filesystem", str(pathlib.Path(__file__).parent.parent)], 
    )
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            toolkit = MCPToolkit(session=session)
            await toolkit.initialize()
            response = await run(toolkit.get_tools(), prompt)
            print(response)

if __name__ == "__main__":
    prompt = sys.argv[1] if len(sys.argv) > 1 else "Read and summarize the file ./readme.md"
    # 确保当前目录下有一个 readme.md 文件
    asyncio.run(main(prompt))

5、Chainlit

import chainlit as cl
from mcp import ClientSession

@cl.on_mcp_connect
async def on_mcp_connect(connection, session: ClientSession):
    """当建立 MCP 连接时调用"""
    # 在此处添加连接建立后的逻辑
    print(f"MCP Connection '{connection.name}' established.")
    # 可以将 session 存储在用户会话中以供后续使用
    cl.user_session.set("mcp_session_" + connection.name, session)
    cl.user_session.set("mcp_connection_" + connection.name, connection)

@cl.on_mcp_disconnect
async def on_mcp_disconnect(name: str, session: ClientSession):
    """当 MCP 连接终止时调用"""
    # 在此处添加连接断开后的逻辑
    print(f"MCP Connection '{name}' disconnected.")
    # 从用户会话中移除 session
    cl.user_session.set("mcp_session_" + name, None)
    cl.user_session.set("mcp_connection_" + name, None)

6、Agno MCP

    # (假设 env 字典包含必要的环境变量,如 API 密钥)
    # import os
    # from dotenv import load_dotenv
    # load_dotenv()
    # env = os.environ.copy() # 获取环境变量

    # import contextlib
    # from agno import Agent
    # from agno.tools.mcp import stdio_client, StdioServerParameters # 导入相关类
    # from agno.chat import OpenAIChat # 导入聊天模型
    # from textwrap import dedent # 用于多行字符串

    airbnb_server_params = StdioServerParameters(
        command="npx",
        args=["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"],
        env=env, # 传递环境变量
    )

    maps_server_params = StdioServerParameters(
        command="npx", args=["-y", "@modelcontextprotocol/server-google-maps"], env=env # 传递环境变量
    )

    # 使用 AsyncExitStack 管理多个异步上下文
    async with contextlib.AsyncExitStack() as stack:
        # 进入 stdio_client 上下文并获取客户端对象
        airbnb_client, _ = await stack.enter_async_context(stdio_client(airbnb_server_params))
        maps_client, _ = await stack.enter_async_context(stdio_client(maps_server_params))

        # 创建 Airbnb 智能体,并将 MCP 客户端作为工具传递
        airbnb_agent = Agent(
            name="Airbnb",
            role="Airbnb Agent",
            model=OpenAIChat("gpt-4o"), # 指定 LLM 模型
            tools=[airbnb_client], # 将 MCP 客户端作为工具
            instructions=dedent("""\
                You are an agent that can find Airbnb listings for a given location.\
            """),
            add_datetime_to_instructions=True,
        )
        # ... (可以类似地定义其他智能体,如 Maps 智能体)

7、Upsonic

import os
from dotenv import load_dotenv
from upsonic import Task, Agent # Direct 未在示例中使用, Search 从 tools 导入
from upsonic.tools import MCPTool, Search # 导入 MCPTool 和 Search

load_dotenv()

openai_api_key = os.getenv("OPENAI_API_KEY")
if not openai_api_key:
    raise ValueError("OPENAI_API_KEY not found in .env file")

# Upsonic 通常会自动从环境变量加载密钥,但显式设置也无妨
# os.environ["OPENAI_API_KEY"] = openai_api_key 

# 定义 MCP 工具类
class HackerNewsMCP(MCPTool):
    # MCPTool 需要 name 和 description
    name = "HackerNewsMCP"
    description = "Fetches top stories from Hacker News via MCP server."
    # command 和 args 定义如何启动 MCP 服务器
    command = "uvx" # 使用 uvx 启动 Python MCP 服务器
    args = ["mcp-hn"] # 指定 MCP 服务器包名
    # 假设 mcp-hn 是一个已安装的 Python 包,提供 MCP 服务
    # 需要先安装: pip install mcp-hn (如果存在这样的包)

# 创建任务
task = Task(
    "Analyze the top 5 HackerNews stories for today. Provide a brief summary of each story, "
    "identify any common themes or trends, and highlight which stories might be most relevant "
    "for someone interested in AI and software development.",
    tools=[HackerNewsMCP, Search] # 将 MCP 工具和内置搜索工具传递给任务
)

# 创建智能体
agent = Agent(
    "Tech News Analyst",
    # description 而不是 company_url/objective 更常用
    description="An AI agent analyzing tech news from HackerNews.", 
    # company_url="https://news.ycombinator.com/", # 可以保留
    # company_objective="To provide insightful analysis of tech industry news and trends" # 可以保留
)

# 执行任务
print("Analyzing HackerNews stories...")
# 使用 agent.do(task) 执行任务并获取结果
result = agent.do(task) 
print(result) # 打印结果

# 或者使用 print_do 直接打印执行过程和结果
# agent.print_do(task) 

网友回复

我知道答案,我要回答