自然语言计算器

一个基于MCP协议和LangChain的个人计算器代理,支持通过自然语言进行数学运算和记录管理。

  • by dosilt
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 dosilt/dosilt-mcp-study

使用说明

个人计算器MCP

使用模型上下文协议(MCP)的个人计算机代理项目。您可以使用LangChain和LangGraph用自然语言控制计算器。

结构

MCPtest/
├── server.py        # MCP 서버 (계산기 도구 제공)
├── client.py        # 스크립트 모드 클라이언트
├── client_cli.py    # 대화형 CLI 클라이언트
├── pyproject.toml   # 프로젝트 설정
└── .env_sample      # 환경변수 샘플

功能

MCP服务器(server.py)

  • 设置/查询用户名
  • 四则运算(加法、减法、乘法、除法)
  • 查看计算历史记录
  • 查询统计信息
  • 累计合计计算
  • 初始化计算器

客户端

  • 客户端.py:按预定义的方案顺序运行
  • client_cli.py:通过交互式界面自由查询

安装

需求

  • Python 3.13+
  • uv(包管理器)

安装方法

# uv 설치 (없는 경우)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 프로젝트 의존성 설치
uv sync

环境设置

.env_sample请参阅 .env 请创建文件。

cp .env_sample .env

环境变量

变量 说明
MODEL_NAME 要使用的型号名称(例如: gpt-4o, Qwen/Qwen3-32B)
OPENAI_API_KEY OpenAI API密钥(使用GPT模型时)
CUSTOM_LLM_URL 自定义LLM服务器URL(使用vLLM等时)

选择型号:

  • 在型号名称中 gpt包括时使用OpenAI API
  • 其他情况 CUSTOM_LLM_URL使用的自定义LLM服务器

使用方法

交互式模式(推荐)

uv run python client_cli.py

命令:

  • 自由输入一般问题
  • help:获取帮助
  • exit 或 quit:结束

脚本模式

uv run python client.py

按顺序运行预定义的方案。

使用示例

💬 You: 내 이름은 철수야
🤖 Bot: 안녕하세요, 철수님! 계산기를 시작합니다.

💬 You: 5 + 3을 계산해줘
🤖 Bot: 철수님, 5 + 3 = 8

💬 You: 10 × 2를 계산해줘
🤖 Bot: 철수님, 10 × 2 = 20

💬 You: 기록 보여줘
🤖 Bot: 📊 철수님의 계산 기록:
1. add: 5 → 3 = 8
2. multiply: 10 → 2 = 20

💬 You: 통계 보여줘
🤖 Bot: 📈 철수님의 통계:
- 총 계산 횟수: 2
- 누적 합계: 28
- 연산별 사용 횟수:
  • add: 1회
  • multiply: 1회

动作原理

体系结构概述

┌─────────────────────────────────────────────────────────────┐
│                        Client                               │
│  ┌─────────────┐    ┌─────────────┐    ┌────────────────┐  │
│  │   User      │───▶│  ReAct      │───▶│  MCP Tools     │  │
│  │   Input     │    │  Agent      │    │  (LangChain)   │  │
│  └─────────────┘    └─────────────┘    └───────┬────────┘  │
└───────────────────────────────────────────────┬┼───────────┘
                                                ││
                              stdio (stdin/stdout)
                                                ││
┌───────────────────────────────────────────────┼┼───────────┐
│                     MCP Server                ▼▼           │
│  ┌────────────────────────────────────────────────────┐   │
│  │  FastMCP (server.py)                               │   │
│  │  - set_user_name, get_user_name                    │   │
│  │  - add, subtract, multiply, divide                 │   │
│  │  - get_history, get_stats, get_total               │   │
│  │  - reset_calculator, reset_all                     │   │
│  └────────────────────────────────────────────────────┘   │
└───────────────────────────────────────────────────────────┘

MCP连接过程

客户端运行时服务器 自动一起运行可以。无需单独运行服务器。

1.设置Stdio Server参数

self.server_params = StdioServerParameters(
    command="python",
    args=["server.py"],
)

StdioServerParameters将MCP服务器作为subprocess运行。 stdin/stdout通过进行通信的方式。客户端 python server.py 自动执行命令。

2.连接到stdio_client

self.stdio_ctx = stdio_client(self.server_params)
read, write = await self.stdio_ctx.__aenter__()

stdio_client创建服务器进程并返回通信通道(read/write流)。

3.初始化ClientSession

self.session_ctx = ClientSession(read, write)
session = await self.session_ctx.__aenter__()
await session.initialize()

ClientSession是处理MCP协议的会话。 initialize()调用将与服务器握手,并获取可用工具列表。

4.将MCP工具转换为LangChain工具

tools = await load_mcp_tools(session)
self.agent = create_react_agent(self.model, tools)

load_mcp_tools将MCP服务器提供的工具转换为LangChain兼容格式。将这些工具连接到ReAct代理后,LLM将分析自然语言问题并自动调用相应的工具。

通信方式比较

方式 说明 使用案例
标准 subprocess+stdin/stdout 本地运行(当前项目)
上海证券交易所 HTTP Server-Sent Events 连接远程服务器
双向通信 双向实时通信实时流媒体

当前项目 标准 因此,客户端和服务器在同一台机器上运行。

依赖性

  • fastmcp:MCP服务器框架
  • mcp:MCP客户端
  • langchain:LLM框架
  • langchain-mcp-adapters:MCP-LangChain适配器
  • langchain-openai:OpenAI集成
  • langgraph:ReAct代理