AI协议标准化工具

MCP是一个开放协议,用于标准化大型语言模型(LLM)与应用之间的上下文交互,支持构建复杂的AI代理和工作流。

  • by MihailaStefanAlexandru
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 MihailaStefanAlexandru/MCP-Server

使用说明

主控程序

MCP协议

MCP是一个开放的协议,它标准化了应用程序如何提供大型语言模型(LLM)的上下文。MCP也是人工智能应用的USB-C端口。正如USB-C提供了一种将设备连接到各种外围设备和配件的标准化方式一样,MCP提供了一种将人工智能模型连接到各种数据源和工具的标准化方式。MCP允许基于LLM构建复杂的代理和工作流程,并将模型与世界连接起来。

MCP提供:

  • LLM可以直接连接的大量预定义集成列表。
  • 为AI应用构建定制集成的标准方法。
  • 一个开放的协议,任何人都可以实现和使用。
  • 灵活性不同的应用程序之间切换,并采取上下文使用。

MCP由两层组成:

  • 数据层:定义基于 JSON-RPC 的客户端-服务器通信协议,包括生命周期管理、工具、资源、提示和通知等基本原始信息。
  • 传输层:定义允许客户端和服务器之间交换数据的通信机制和渠道,包括稳定特定的传输连接,消息缓存和授权。

项目架构

模式块软件

应用理论考虑

服务器和客户端之间的通信可以通过标准流(STDIO)和HTTP协议进行。

在此实现中,选择了基于HTTP的方法,因为通常情况下,许多用户无法访问服务器和客户端,他们只能在本地运行的两个组件中的一个。 然而,也研究了通过标准流的实施。

HTTP STDIO
服务器可以在另一台云计算机上运行,容器化。
与OpenWebUI或其他使用HTTP的应用程序更容易集成。
测试和调试更简单 性能好(无开销)
可扩展性,可以添加身份验证,集中日志 适用于测试和集成到CLI系统

服务器

MCP协议假定存在两个实体:服务器暴露工具,客户端通过LLM消费它们。

服务器是文件管理系统(或完全不同的结构)和客户端之间的桥梁。他必须向客户展示可用的工具,以便LLM能够知道他可以使用什么来满足用户的需求。

工具是根据MCP规范定义的,每个工具都有一个名称,描述和参数的JSON-Schema框架:

(例如,实现 list_root_children 工具)

Tool(
  name="list_root_children",
  description="Listează fișierele și folderele din root-ul Alfresco",
  inputSchema={
    "type": "object",
    "properties": {
    "maxItems": {
        "type": "integer",
        "description": "Numărul maxim de elemente de returnat (default: 20)",
        "default": 20
      }
    }
  }
)

服务器有三个主要职责:

  • 向客户提供可用的工具。
  • 管理来自客户端的呼叫并以 MCP 格式返回响应。
  • 确保连接到数据源(在这种情况下,Alfresco)。

客户

客户端确保用户和LLM之间的连接,因此用户可以实时查看LLM提供的结果,并根据这些结果提出其他更复杂的要求,最终将最终确定用户想要做的事情。

此外,系统提示符和函数调用也可以在这里找到,因为在客户端中,它们尽可能接近LLM,它们主要用于它。它们的作用是服务于用户想要使用LLM的最终目的。

系统提示定义了LLM必须发挥的作用,以完成任务。它还包含了可用工具的列表以及如何为用户制定答案:

system_prompt = f"""=== CONTEXT SYSTEM ===
        
    Ești un asistent AI expert în Alfresco Document Management System cu acces la tool-uri MCP prin HTTP.

    Server MCP: {self.mcp_server_url}
    Model: {self.provider.upper()} - {self.model}
    {connection_info}

    Ai aceste informații despre tool-urile disponibile și modalitatea în care sunt ele folosite:
    {tools_info}

    Acesta este contextul curent:
    {context_str}

    Acestea sunt rezultatele anterioare returnate de tool-uri
    {tool_results_str}

    === INSTRUCȚIUNI ===
    - Dacă ai rezultate de la tool-uri MCP, folosește-le în răspuns
    - Respectă schema parametrilor din tool-uri; tipurile numerice trebuie să fie integer.
    - Dacă tool-ul nu este disponibil sau eșuează, explică utilizatorului.
    - Folosește contextul și rezultatele anterioare pentru a explica acțiunile.
    - Folosește tool-ul care se potrivește cât mai bine cu cererea.
    - Răspunde concis și profesional, fără a repeta inutil contextul.
    - Generează doar răspunsuri utile pentru cererea curentă, evitând textul suplimentar.
    - Nu încerca să apelezi tool-uri direct din acest prompt — asta se face separat prin analiza intenției.

    === CERERE UTILIZATOR ===
    {user_input}

    === RĂSPUNS ===
    """

        return system_prompt

函数调用用于向LLM提供如何调用可用工具的信息。也就是说,我必须从用户输入中提取参数来调用符合用户需求的工具:

if action == "call_tool":
  tool_name = analysis.get('tool_name')
  arguments = analysis.get('arguments', {})
  explanation = analysis.get('explanation', '')

  if tool_name not in self.mcp_tools:
    return f"❌ Tool-ul '{tool_name}' nu este disponibil"

  print(f"🎯 Execut: {explanation}")
  tool_result = await self.call_mcp_tool_http(tool_name, arguments)
  formatted = self.format_tool_result(tool_name, tool_result)
  return f"📝 Explicație: {explanation}\n\n🔧 Rezultat {tool_name}:\n{formatted}"

客户端不实现工具逻辑,而是通过MCP调用服务器暴露的工具并向用户显示结果。

流程图

OpenWeb用户界面

OpenWebUI被用来提供一个图形界面,以便用户以更简单的方式查看其请求的答案。

llm提供的结果由客户端使用HTTP协议发送到OpenWebUI接口。

在OpenWebUI中,有一个模型,它只是上面提到的LLM而已,只是创建了一个链接端点,以给人以直接访问接口的印象。该终端点显示新模型的名称和其他信息,包括服务器显示的工具名称。

安装和配置

打开 Python 3.12 虚拟环境,使用命令进行安装 pip install --r requiremnets.txt 运行文件所需的工具。

使用指南

  1. 启动 Alfresco 的 docker 容器 docker compose up -d.

  2. 启动 MCP 服务器: ./alfresco_mcp_server.py

  3. 启动 adapter.py,允许打开 OpenWebUI 和客户端。 python3 adapter.py

  4. 启动 OpenWebUI 的 docker 映像:

docker run -d   
  -p 3000:3000   
  -v openwebui-data:/app/backend/data   
  -e PORT=3000   
  -e OPENAI_API_BASE_URL=http://host.docker.internal:8001/v1   
  -e OPENAI_API_KEY=sk-anything   
  -e WEBUI_SECRET_KEY=your-secret-key   
  --add-host=host.docker.internal:host-gateway   
  --name openwebui   
  ghcr.io/open-webui/open-webui:main

OpenWebUI 打开http://localhost:3000.如果使用端口转发,则localhost更改为IP地址。

测试用品

测试提示

测试示例已移动到 Test-prompts.md 文件,以避免加载文档文件。

资源