圣诞礼物请求代理

一个基于LangGraph的代理,使用MCP(模型上下文协议)工具来管理圣诞礼物请求,检查用户是否表现良好并提交礼物请求给圣诞老人。

  • by MartinHodges
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 MartinHodges/present-list

使用说明

Presie List-圣诞老人礼物申请代理

一个基于LangGraph的代理,它使用MCP(模型上下文协议)工具来帮助管理圣诞礼物请求。代理人会检查你是否淘气或友善,并向圣诞老人提交礼物请求。

建筑

该项目包括:

  1. LangGraph代理 (src/agent/)-使用ChatGPT编排当前请求工作流
    • 连接到独立的MCP HTTP服务器
    • 将MCP工具包装为LangChain工具
    • 代理和工具执行节点之间的路由
  2. MCP HTTP服务器 (src/mcp/http-server.ts)-端口3100上的独立HTTP服务器提供:
    • check_naughty_or_nice -检查某人是否淘气或友善
    • request_presents -根据淘气/乖巧的状态向圣诞老人提交礼物请求
    • 多个并发客户端的会话管理
    • 基于HTTP的JSON-RPC与SSE用于通知

设置

  1. 安装依赖项:
npm install
  1. 创建一个 .env 使用您的OpenAI API密钥文件:
cp .env.example .env
# Edit .env and add your OPENAI_API_KEY

运行应用程序

该应用程序需要两个进程:MCP服务器和代理。

端子1 -启动MCP HTTP服务器:

npm run mcp:http

2号航站楼 -运行代理:

交互模式 (与圣诞老人的精灵聊天):

npm run dev

您将与圣诞老人的一位乐于助人的精灵聊天,他将:

  1. 听听你想要什么礼物
  2. 聊天时跟踪您的列表
  3. 智能地检测你何时完成(如“就这样”、“我完成了”等短语)
  4. 检查你是否淘气/友善,并将你的清单提交给圣诞老人
  5. 键入“exit”退出

示例会话:

🎅 Welcome to Santa's Present Request Service!

I'm one of Santa's elves, here to help you build your Christmas list.

You: I want a bike for Christmas
Elf: Great choice! I've added a bike to your list. What else would you like?

You: Also some books
Elf: Wonderful! Books are added. Anything else?

You: And a video game. That's all!
Elf: Perfect! Let me check if you've been naughty or nice...

🎄 Processing your request...

Elf: Good news! You've been nice this year! Santa has approved all 3 presents on your list.

单请求模式:

npm run dev "I want a PlayStation 5 and some games"

传统stdio模式:

npm run mcp  # Old stdio-based server (deprecated)

生产建设:

npm run build
npm start

运作原理

  1. 初创公司:MCP HTTP服务器在端口3100上启动
  2. 连接:代理通过HTTP连接到服务器(StreamableHTTPClientTransport)
  3. 工具注册:MCP工具转换为LangChain动态结构化工具
  4. 用户请求:用户通过命令行输入当前请求
  5. Agent推理:ChatGPT根据请求决定调用哪些工具
  6. 工具执行:
    • 首次通话 check_naughty_or_nice 通过HTTP获取用户状态
    • 然后打电话 request_presents 淘气/漂亮的分数
  7. 回应:代理将圣诞老人的决定返回给用户

MCP工具

MCP服务器通过HTTP进行通信,并公开了两个工具:

检查8月或通知:

  • 输入: userName (必填), context (可选)
  • 退货: { status: 'naughty'|'nice', score: 0-100, reason: string }

请求_呈现:

  • 输入: userName, presents[], naughtyNiceScore
  • 退货: { approved: boolean, presents: Present[], message: string }
  • 逻辑:得分>=50=所有礼物均已批准,得分<50=仅低优先级项目