动态工具发现演示系统

一个演示动态工具发现的概念验证系统,模拟德国电视观众测量数据查询功能,支持按节目、频道、类型和人口统计分类进行查询。

  • by ucKaizen
  • Python
  • 本地部署
  • 更新于
在 GitHub 查看 ucKaizen/mcpagents

使用说明

AGF介质测量——MCP代理演示

概念验证演示 动态工具发现 使用MCP和LLM。系统模拟 AGF德国-风格电视观众测量数据——覆盖率、市场份额、跨媒体指标——都可以按节目、频道、类型和人口统计细分进行查询。

关键演示: 工具集在运行时注册/注销。LLM在每个回合都会发现新的功能——从基本指标开始,然后将高级分析带到网上,并观看LLM立即使用它们。

建筑

┌──────────────────────────────────────────────────────────────────────────────┐
│                          Railway Project                                     │
│                                                                              │
│  Service 1: Gateway (:8000)                                                  │
│  ┌──────────────────────────────┐         Service 2: Basic Metrics (:8002)  │
│  │  Tool Registry (REST API)    │◄─register──┌──────────────────────┐       │
│  │  Web Agent (OpenAI LLM)      │──invoke───►│ list_channels        │       │
│  │  Web UI (chat + inspector)   │            │ list_programs         │       │
│  │                              │            │ get_program_reach     │       │
│  │  /api/register               │            │ get_channel_share     │       │
│  │  /api/deregister/{name}      │            └──────────────────────┘       │
│  │  /api/toolsets               │                                            │
│  │  /ws/chat                    │         Service 3: Advanced Analytics      │
│  │                              │◄─register──┌──────────────────────┐       │
│  │                              │──invoke───►│ get_top_programs      │       │
│  └──────────────────────────────┘            │ get_demographic_brkdn │       │
│                                              │ get_cross_media_reach │       │
│   Browser ◄──WebSocket──► Gateway            │ compare_channels      │       │
│                                              │ get_genre_performance │       │
│                                              └──────────────────────┘       │
└──────────────────────────────────────────────────────────────────────────────┘

它是如何工作的:

  1. 网关启动--还没有可用的工具
  2. 工具集服务启动并将其工具定义POST到 POST /api/register
  3. 在每条聊天消息中,网关都会发现当前注册的工具
  4. LLM决定调用哪些工具;网关代理对所属工具集的调用
  5. 如果一个工具集停止,它的工具就会消失——LLM会在下一轮进行调整

演示流程

  1. 启动网关——聊天显示“没有可用工具”
  2. 启动基本度量——UI显示工具集已上线,包含4个工具
  3. 问: “Tagesschau在65岁以上人群中的影响力有多大?” --LLM使用 get_program_reach
  4. 问: “向我展示Tatort的完整人口统计数据” --LLM说它不能(没有工具)
  5. 启动高级分析——UI显示还有5个工具上线
  6. 问同样的问题——LLM现在使用 get_demographic_breakdown 并给出一个完整的矩阵
  7. 停止基本指标——LLM失去了基础工具,但保留了高级工具

工具

工具集:基本指标

工具 说明
list_channels() 列出所有10个德国电视频道
list_programs(channel?, genre?) 使用过滤器浏览程序
get_program_reach(program, age_group?, gender?) 达到千+%
get_channel_share(channel, age_group?, gender?) 市场份额%

工具集:高级分析

工具 说明
get_top_programs(metric?, n?, age_group?, gender?) 排名前N的项目
get_demographic_breakdown(name, entity_type?) 完整年龄x性别矩阵
get_cross_media_reach(name, entity_type?, age_group?, gender?) 电视+流媒体覆盖
compare_channels(channels, metric?, age_group?, gender?) 并排比较
get_genre_performance(genre, age_group?, gender?) 综合流派指标

快速入门(本地)

先决条件

  • Python 3.10+
  • OpenAI API密钥

设置

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
export OPENAI_API_KEY=sk-...

运行(3个终端)

终端1——网关:

python3 gateway/app.py
# Starts on http://localhost:8000

终端2——基本度量工具集:

python3 toolsets/basic_metrics.py
# Registers 4 tools with the gateway

终端3——高级分析工具集:

python3 toolsets/advanced_analytics.py
# Registers 5 tools with the gateway

打开 http://localhost:8000 在您的浏览器中。

随时启动/停止工具集——UI实时更新,LLM根据下一条消息进行调整。

部署到铁路

1.从同一仓库创建3个服务

在Railway中,创建一个新项目,然后添加3个服务,所有服务都指向 ucKaizen/mcpagents GitHub仓库:

服务 Dockerfile 环境变量
网关 gateway/Dockerfile OPENAI_API_KEY=sk-...
基本度量 toolsets/Dockerfile.basic GATEWAY_URL=http://gateway.railway.internal:8000, SELF_URL=http://basic-metrics.railway.internal:8002
高级分析 toolsets/Dockerfile.advanced GATEWAY_URL=http://gateway.railway.internal:8000, SELF_URL=http://advanced-analytics.railway.internal:8003

2.配置网络

  • 生成一个 公有领域 仅适用于网关服务(这是您在浏览器中打开的URL)
  • 工具集通过Railway与网关通信 内部联网 (.railway.internal)

3.演示

  • 从Railway仪表板停止/启动工具集服务
  • 实时观察聊天界面的反应

项目结构

mcpagents/
├── gateway/
│   ├── app.py              # Gateway: registry + web agent + UI server
│   └── Dockerfile
├── toolsets/
│   ├── basic_metrics.py    # Toolset 1: list, reach, share
│   ├── advanced_analytics.py # Toolset 2: top, demographics, cross-media
│   ├── Dockerfile.basic
│   └── Dockerfile.advanced
├── server/
│   └── media_data.py       # Shared data engine (deterministic, no DB)
├── web/
│   └── index.html          # Chat UI + tool inspector + toolset status
├── requirements.txt
└── README.md

数据设计

没有数据库。所有受众数据都是从基于哈希的种子+现实的人口统计偏差矩阵中确定生成的:

  • 类型偏见 --新闻偏65(1.9倍),娱乐偏14-29(1.5倍),体育偏男性(1.45倍)
  • 渠道偏见 --ARD/ZDF在老年人口中占主导地位,ProSieben以14-29岁的成绩最强
  • 校准的 --Tagesschau约900万人,ARD约12%的份额,与真实的AGF数据相匹配
  • 跨媒体 --流媒体在线性电视的基础上增加了5-25%,对年轻观众来说更重
  • 确定性的 --相同的查询总是返回相同的数字

聊天机器人约束

LLM配置为 专业媒体分析助理。它将:

  • 仅回答有关德国电视观众测量的问题
  • 仅使用注册工具中的数据(切勿猜测或编造数字)
  • 明确说明何时缺少功能(工具集未注册)
  • 拒绝回答无关的问题(编码、常识等)