使用说明
ap-mcp:mcp服务器+具有自动注册功能的SDK
概述
FastAPI MCP服务器+功能SDK,用于将工具构建为普通Python函数。工具公开了一个FastAPI应用程序,在启动时向MCP服务器自动注册清单,服务器将调用路由到每个函数端点。
主要特点:
- 语义工具发现 –使用句子转换器(
all-MiniLM-L6-v2)将用户查询与工具描述相匹配 - 本地LLM工具调用 –奥拉玛与
qwen2.5:1.5b(或任何其他工具调用模型)选择并参数化工具 - 自动注册 –工具在启动时自行注册;无需手动配置
- 功能SDK –使用装饰器将工具编写为普通Python函数
先决条件
Ollama(必填)
服务器使用 奥拉玛 用于LLM电动工具选择。运行前安装并启动Ollama。
curl -fsSL https://ollama.com/install.sh | sh
ollama serve
ollama pull qwen2.5:1.5b
注: 如果模型不存在,服务器将在首次启动时自动拉取模型,但这可能需要一些时间。
支持的型号: 任何具有本机工具调用支持的Olama模型都可以工作。通过配置 OLLAMA_MODEL 有人是。
快速开始
cd ap-mcp
ollama serve
just run
建筑
┌─────────────┐ ┌─────────────────────────────────────────────────┐
│ UI │ │ MCP Server │
│ (port 8501) │────▶│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
└─────────────┘ │ │ Registry │ │ VectorDB │ │ Orchestrator │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ Ollama (LLM) │ │
│ │ Tool selection & response synthesis │ │
│ └─────────────────────────────────────────┘ │
└──────────────────────┬──────────────────────────┘
│ HTTP proxy calls
┌──────────────────────▼──────────────────────┐
│ External Tools │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ calculator_tool│ │ (your tool) │ │
│ │ (port 5080) │ │ │ │
│ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────┘
数据流:
- 用户通过UI$\rightarrow$Server发送消息
/message端点 LLMOrchestrator查询VectorDB以获取语义相似的工具- Ollama选择最佳工具,并通过本机工具调用提取参数
- 服务器将调用代理到工具的HTTP端点
- Ollama从工具输出中合成自然语言响应
服务和端点
| 服务 | URL | 描述 |
|---|---|---|
| MCP 服务器 | http://localhost:5000 | 中心枢纽 |
| 计算器工具 | http://localhost:5080 | 示例工具 |
| 用户界面 | http://localhost:8501 | 聊天界面 |
服务器端点
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | / |
基本状态消息 |
| 得到 | /health |
活体探针 |
| 得到 | /ready |
就绪性探测(由Docker健康检查使用) |
| 职位 | /register |
工具在启动时在此处发布其清单 |
| 得到 | /tools |
列出已注册的工具(例如。, calculator, calculator.add) |
| 职位 | /message |
主聊天端点——处理用户消息 |
工具端点(每个工具)
| 方法 | 路径 | 描述 |
|---|---|---|
| 得到 | /manifest |
退货 list[Manifest] 对于工具 |
| 职位 | /invoke/{function_name} |
调用特定函数(例如。, /invoke/add) |
用户界面
聊天界面可在http://localhost:8501.它连接到MCP服务器,并使用Ollama根据自然语言查询智能地选择和调用已注册的工具。
交互示例:
- “5加3等于多少?”$\rightarrow$调用
calculator.add(5, 3) - “添加10和20”$\rightarrow$调用
calculator.add(10, 20)
创作工具
用以下内容注释函数 @mcp_tool(name=...) 并将其传递给 create_app:
from tool_sdk import mcp_tool, create_app
import uvicorn
import os
@mcp_tool(name="calculator")
def add(a: int, b: int) -> int:
"""Add two integers and return the result."""
return a + b
@mcp_tool(name="calculator")
def multiply(a: int, b: int) -> int:
"""Multiply two integers and return the product."""
return a * b
if __name__ == "__main__":
app = create_app([add, multiply])
port = int(os.environ.get("TOOL_PORT", "5080"))
uvicorn.run(app, host="0.0.0.0", port=port)
重要提示: 文档字符串是 关键的 –它们由VectorDB索引以进行语义搜索。编写清晰、描述性的文档字符串,解释函数的作用。
注册工作原理
- 工具通过SDK启动其FastAPI应用程序
- SDK为每个工具组构建清单:
name:组名(来自@mcp_tool(name=...))base_url:TOOL_PUBLIC_URLenv 是methods:[{name, description, parameters, path, http_method}]由函数签名和文档字符串构建
- SDK将清单POST到
${MCP_SERVER_URL}/register - 服务器验证并存储:
- 工具组的顶级条目(元数据)
- 每种方法的代理(例如。,
calculator.add)这称为工具/invoke/{method}
- 用于语义搜索的VectorDB中的服务器索引方法描述
配置
环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
OLLAMA_HOST |
http://localhost:11434 |
Ollama服务器URL |
OLLAMA_MODEL |
qwen2.5:1.5b |
LLM刀具选择模型 |
MCP_SERVER_URL |
http://mcp_server:5000 |
服务器URL(用于工具) |
TOOL_PUBLIC_URL |
– | 工具的公共URL(用于注册) |
TOOL_PORT |
5080 |
工具维修端口 |
PORT |
5000 |
MCP服务器端口 |
FLAVOR |
– | 设置为 localdev 用于热重载 |
使用不同的Olama模型
# Set via environment variable
export OLLAMA_MODEL=llama3.1:8b
just run
# Or in docker-compose.yml
environment:
- OLLAMA_MODEL=qwen2.5:7b
发展
命令(使用 just)
just run # Start full stack (Docker Compose)
just build # Build Docker images
just shell <svc> # Interactive shell in container (e.g., just shell mcp_server)
just test # Run pytest
just lint_full # Run ruff + mypy + fawltydeps
just lint_fix # Auto-fix linting issues
just dc <cmd> # Run command inside Docker (e.g., just dc test)
