计算服务器

一个基于FastMCP框架的简单计算服务器,提供加法、乘法和随机数生成功能,用于演示Model Context Protocol (MCP) 的应用。

  • by remcoboerma
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 remcoboerma/mcp-server-demo

使用说明

FastMCP演示-计算器服务器

一个简单的演示 模型上下文协议(MCP) 使用FastMCP构建的服务器。

什么是MCP?

模型上下文协议(MCP) 它是一种标准协议,允许人工智能助理(如Claude)与外部工具和服务进行通信。把它想象成一个“插座”,人工智能可以插入他们的“插头”以获得额外的功能。

为什么这很有用?

  • 人工智能可以计算,查询数据库,读取文件等。
  • 你不需要给人工智能所有的背景 - 人工智能会自己询问
  • 可重复使用:一台服务器可与所有 MCP 兼容的 AI 配合使用

什么是FastMCP?

FastMCP 是一个Python框架,使构建MCP服务器非常简单。它的工作原理类似于FastAPI - 你编写普通的Python函数并添加一个 @mcp.tool() 装饰师脚趾。

此 Demo

这个演示包含一个简单的计算器,有3个工具:

  • add 加两个数字
  • multiply 乘以两个数字
  • random_number 生成一个随机数

安装

步骤1:虚拟制造环境

inv venv

这使得一个 .venv 一个孤立的Python环境。

为什么是虚拟环境?

  • 依赖关系与您的 Python 系统保持分离
  • 与其他项目无冲突
  • 易于删除(只需删除) .venv/)

步骤 2: 安装依赖关系

inv install

这将安装FastMCP及其所有依赖关系。

技术背景:

  • 自动使用任务 .venv/bin/python3 如果存在
  • 否则将返回系统 python3
  • 确保所有工具在正确的环境中运行

使用

1.服务器启动(开发模式)

inv dev

服务器现在正在运行并通过stdio(标准输入/输出)监听命令。

2. 检查可用工具

inv inspect

它显示了服务器提供的所有工具,包括其参数和文档。

3.测试工具

inv test

这将运行一个完整的测试脚本,显示如何:

  • 连接到 MCP 服务器
  • 使用参数调用工具
  • 已处理结果

测试功能是如何工作的? (技术解释)

的 inv test 函数显示完整的客户端-服务器流:

步骤1:服务器处理子流程开始

params = StdioServerParameters(command='python', args=['server.py'])

这是怎么回事?
我们开始 python server.py 作为一个单独的过程(subprocess)。我们通过这个过程进行沟通。 标准 这意味着我们通过标准输入和输出来回发送JSON消息。

为什么是STDIO?

  • 简单:无论Python在哪里运行
  • 安全:服务器在自己的进程中运行
  • 默认:大多数 MCP 服务器使用 stdio

步骤 2: 建立客户端连接

async with stdio_client(params) as (read, write):
    async with ClientSession(read, write) as session:

这是怎么回事?

  • stdio_client 创建两个“通道”:一个用于阅读,一个用于写作
  • ClientSession 根据MCP协议管理通信
  • 的 async with 确保一切顺利关闭(包括错误)

为什么是async?
MCP基于异步通信。这意味着客户端不必等待服务器完成 - 它可以同时发送多个请求。

步骤 3: 初始化连接

await session.initialize()

这是怎么回事?
客户端和服务器进行“握手” - 他们交换以下信息:

  • 他们使用的协议版本
  • 他们支持哪些功能
  • 哪些工具可用

这类似于在说话之前建立电话连接。

步骤4:调用工具

result = await session.call_tool('add', {'a': 5, 'b': 3})
print(f"Result: {result.content[0].text}")

这是怎么回事?

  1. 客户端向服务器发送JSON-RPC消息:“调用'add'工具,a=5,b=3”
  2. 服务器接收了它,然后运行 add 功能从
  3. 服务器将结果作为JSON返回
  4. 客户端解析结果并返回

里面有什么 result?

  • result.content 是内容项目的列表
  • result.content[0] 第一个项目(通常是唯一的)
  • result.content[0].text 是结果的文本表示

完整流量可视化

┌─────────┐ ┌─────────┐ │ 客户端│ │ 服务器│ │ (测试)│ │(server.py)│ └────┬────┘ └────┬────┘ │ │ │ 1. 启动子进程:python server.py│ ├─────────────────────────────────────────────>│ │ │ │ 2. 初始化(握手)│ ├─────────────────────────────────────────────>│ │<─────────────────────────────────────────────┤ │ (服务器信息、可用工具)│ │ │ │ 3. call_tool('add',{a:5,b:3})│ ├─────────────────────────────────────────────>│ │ │ (贝雷肯5+3) │<─────────────────────────────────────────────┤ │ 结果:“8”│ │ │ │ 4. call_tool('倍数',{a:4,b:7})│ ├─────────────────────────────────────────────>│ │ │ (贝雷肯4*7) │<─────────────────────────────────────────────┤ │ 结果:“28”│ │ │ │ 5. 关闭连接│ ├─────────────────────────────────────────────>│ │ │ (服务器已停止) └──────────────────────────────────────────────┘

Je特征工具制造商

添加新工具 server.py:

@mcp.tool()
def divide(a: float, b: float) -> str:
    """Deel twee getallen. Let op deling door nul!"""
    if b == 0:
        return "Error: Kan niet delen door nul"
    return str(a / b)

测试满足: inv test (首先在tasks.py中添加一个测试)

学生的实践练习

练习1:字符串操作工具

创建一个翻转字符串的工具:

@mcp.tool()
def reverse_string(text: str) -> str:
    """Keer een string om"""
    return text[::-1]

练习2:编辑列表

创建一个计算数字列表平均值的工具:

@mcp.tool()
def average(numbers: list[float]) -> float:
    """Bereken gemiddelde van een lijst getallen"""
    return sum(numbers) / len(numbers)

练习3:自己的想法

想出一个有用的工具。想法:

  • 温度转换(摄氏度)↔ 华氏度)
  • 身体质量指数计算器
  • 密码强度检查器
  • Morse代码的字符串
  • JSON验证器

故障排除

“ModuleNotFoundError:没有名为'fastmcp'的模块” → Run inv install 首先

“服务器启动niet” → 检查Python是否处于活动状态: python --version 检查server.py是否有语法错误

“工具不会产生输出” 检查返回类型是否正确(必须是 str、int、float 等) 看看这个功能是否有一个 return 声明是

下一步

  1. 使用 Claude Desktop
    将此服务器添加到您的 Claude 桌面配置

  2. 构建更复杂的工具

    • 执行数据库查询
    • 读取/写入文件
    • 调用 API
    • 整合外部服务
  3. 了解更多关于MCP

许可证

公共领域 - 免费用于教育目的。