capiscio/a2a-demos
GitHub: capiscio/a2a-demos
一套展示AI代理信任徽章、身份验证和工具级授权的演示项目,用于保障A2A和MCP协议通信安全。
Stars: 2 | Forks: 0
# CapiscIO 演示
## 演示概览
| 演示 | 展示内容 | 时长 | 快速开始 |
|------|---------------|------|-------------|
| **[演示一:从零到强制执行](#demo-one--zero-to-enforcement)** | `@guard` 装饰器、信任等级、徽章访问控制 | 5 分钟 | `cd demo-one && ./setup.sh` |
| **[演示二:策略即代码](#demo-two--policy-as-code)** | 运行时策略变更改变强制执行效果 — 无需代码部署 | 10 分钟 | `cd demo-two && ./setup.sh` |
| **[MCP Guard 演示](#mcp-guard-demo)** | 服务器身份、每工具信任、客户端验证 | 5 分钟 | `cd mcp-demo && docker compose up` |
| **[Agent Guard 演示](#agent-guard-demos)** | 3 个框架代理带 DID、徽章、实时事件 | 15 分钟 | `./scripts/setup.sh` |
**初次接触 CapiscIO?** 从演示一开始 — 只需 5 分钟即可了解核心概念。
## 前置条件
- Python 3.11+
- 免费 CapiscIO 账户 — 在 [app.capisc.io](https://app.capisc.io) 注册
- 来自仪表板 → 设置 → API 密钥的 API 密钥
- 在仪表板中注册的 MCP 服务器(用于 demo-one 和 demo-two)
## 演示一 — 从零到强制执行
**"5 分钟从零到受信任强制的 MCP 工具。"**
一个具有三个不同信任等级的 MCP 工具的 MCP 服务器。受信任的代理(带有徽章)可以调用受限工具;不受信任的代理(无徽章)将被拒绝。
### 你将看到的内容
| 场景 | 代理 | 工具 | 信任等级 | 结果 |
|----------|-------|------|-------------|--------|
| 1 | 受信任(DV 徽章) | `get_price` | 0(开放) | 允许 |
| 2 | 受信任(DV 徽章) | `place_order` | 2(DV+) | 允许 |
| 3 | 不受信任(无徽章) | `get_price` | 0(开放) | 允许 |
| 4 | 不受信任(无徽章) | `place_order` | 2(DV+) | **拒绝** |
### 设置
```
cd demo-one
./setup.sh # Creates venv, installs deps, downloads binary
cp .env.example .env # Fill in your API key + server ID
```
### 运行
```
source .venv/bin/activate
python run_demo.py
```
### 关键代码
**服务器** — 每个工具一个装饰器:
```
@server.tool(min_trust_level=0)
async def get_price(sku: str) -> str: ...
@server.tool(min_trust_level=2)
async def place_order(sku: str, quantity: int) -> str: ...
@server.tool(min_trust_level=4)
async def cancel_all_orders() -> str: ...
```
**代理** — 一行代码连接:
```
identity = CapiscIO.connect(api_key=..., auto_badge=True)
```
### 文件
```
demo-one/
├── server/main.py # MCP server with 3 guarded tools
├── agents/
│ ├── trusted_agent.py # Badged agent (auto_badge=True)
│ └── untrusted_agent.py # No-badge agent (auto_badge=False)
├── run_demo.py # Orchestrator: 4 scenarios
├── setup.sh # Environment setup + binary download
├── .env.example # Credential template
└── requirements.txt
```
## 演示二 — 策略即代码
**"相同代码,三种不同强制执行结果 — 由策略改变,而非部署。"**
展示组织级策略如何在运行时改变信任强制执行。演示者在各阶段之间在仪表板中切换策略;相同的代理和服务器会产生不同的允许/拒绝结果。
### 三个阶段
**阶段 1 — 基线**(信任等级按代码设置)
| 代理 | get_price | place_order |
|-------|-----------|-------------|
| 受信任(DV) | 允许 | 允许 |
| 不受信任 | 允许 | **拒绝** |
**阶段 2 — 锁定**(全局最小值提升至 EV)
| 代理 | get_price | place_order |
|-------|-----------|-------------|
| 受信任(DV) | **拒绝** | **拒绝** |
| 不受信任 | **拒绝** | **拒绝** |
**阶段 3 — 选择性**(get_price 覆盖为需要 DV)
| 代理 | get_price | place_order |
|-------|-----------|-------------|
| 受信任(DV) | 允许 | 允许 |
| 不受信任 | **拒绝** | **拒绝** |
### 设置
```
cd demo-two
./setup.sh
cp .env.example .env # Fill in API key, server ID, org ID, admin JWT
```
创建三个策略提案:
```
source .venv/bin/activate
python scripts/setup_policies.py
```
### 运行
```
python run_demo.py
```
脚本在各阶段之间暂停,以便你可以在仪表板中切换策略。
### 策略文件
```
# policies/lockdown.yaml — 紧急响应
version: "1"
min_trust_level: "EV"
```
```
# policies/selective.yaml — 按工具覆盖
version: "1"
mcp_tools:
- tool: "get_price"
min_trust_level: "DV"
```
### 文件
```
demo-two/
├── policies/
│ ├── baseline.yaml # Default enforcement
│ ├── lockdown.yaml # Global min = EV (deny all)
│ └── selective.yaml # get_price overridden to DV
├── scripts/
│ └── setup_policies.py # Creates policy proposals via admin JWT
├── server/main.py # Same MCP server as demo-one
├── agents/ # Same agents as demo-one
├── run_demo.py # Interactive 3-phase orchestrator
├── setup.sh
├── .env.example
└── requirements.txt
```
## MCP Guard 演示
**"MCP 服务器的 Let's Encrypt"** — 自动加密身份、信任徽章和每工具访问控制。
| 功能 | 描述 |
|---------|-------------|
| `MCPServerIdentity.connect()` | 一行代码:生成密钥、注册 DID、获取徽章 |
| 服务器身份在 `_meta` 中 | 每个 `initialize` 响应都携带服务器的 DID + 徽章 |
| 每工具信任等级 | `@server.tool(min_trust_level=N)` — 例如 `list_files`=0, `read_file`=2, `write_file`=3 |
| 客户端验证 | 客户端在调用工具之前验证服务器 DID + 徽章 |
| 自动续期 | `ServerBadgeKeeper` 在徽章过期前续期 |
### 快速开始
```
cd mcp-demo
cp .env.example .env # Set CAPISCIO_SERVER_ID + CAPISCIO_API_KEY
docker compose up --build # Starts registry, MCP server, and client
```
**→ 完整设置、架构和预期输出:[`mcp-demo/README.md`](mcp-demo/README.md)**
## Agent Guard 演示
运行 **3 个 AI 代理**,分别使用不同框架构建,均由 CapiscIO 信任徽章保护:
- **LangChain** — 带工具调用的研究代理(端口 8001)
- **CrewAI** — 用于创意任务的多代理团队(端口 8002)
- **LangGraph** — 带复杂工作流程的有状态代理(端口 8003)
所有代理都使用 `CapiscIO.connect()` 获取加密身份(DID)、注册到注册表,并参与受信任的代理间通信。通过 [CapiscIO 仪表板](https://app.capisc.io) 实时查看它们的**事件日志**。
### 快速开始
### 前置条件
- Python 3.11+(3.14+ 可用但会显示弃用警告)
- OpenAI API 密钥(或兼容的 LLM)
- 免费 CapiscIO 账户 — 在 [app.capisc.io](https://app.capisc.io) 注册
### 1. 设置代理环境
```
cd a2a-demos
./scripts/setup.sh # Creates per-agent .venvs, installs deps + shared module
cp .env.example .env
```
### 2. 配置环境
使用你的凭据编辑 `.env`:
```
OPENAI_API_KEY=sk-your-openai-key
OPENAI_MODEL=gpt-4o-mini
CAPISCIO_SERVER_URL=https://registry.capisc.io
CAPISCIO_API_KEY=sk_live_your_api_key_here
SECURITY_MODE=ca
```
从 [app.capisc.io](/.capiscio/keys/`
2. **派生 `did:key` URI** — 从公钥(RFC-002 §6.1)
3. **注册到注册表** — 通过 `/v1/sdk/agents` 创建代理记录
4. **修补 DID + 公钥** — 将加密身份链接到代理
5. **激活代理** — 将状态设置为"active"
6. **启动 BadgeKeeper** — 后台线程自动续信任徽章
7. **提供 A2A 端点** — 代理卡在 `/.well-known/agent.json`,任务在 `/tasks/send`
## 项目结构
```
a2a-demos/
├── demo-one/ # Zero to Enforcement (5 min)
│ ├── server/main.py # MCP server with 3 guarded tools
│ ├── agents/ # Trusted + untrusted agents
│ ├── run_demo.py # 4-scenario orchestrator
│ └── setup.sh # One-command setup
├── demo-two/ # Policy as Code (10 min)
│ ├── policies/ # 3 YAML policy files
│ ├── scripts/setup_policies.py # Policy creation via admin JWT
│ ├── run_demo.py # Interactive 3-phase orchestrator
│ └── setup.sh
├── mcp-demo/ # MCP Guard demo (Docker)
│ ├── server/main.py # Guarded MCP filesystem server
│ ├── client/main.py # Client with server verification
│ ├── docker-compose.yml # Full stack orchestration
│ └── README.md # Detailed MCP demo docs
├── agents/
│ ├── langchain-agent/ # LangChain research agent (port 8001)
│ ├── crewai-agent/ # CrewAI multi-agent crew (port 8002)
│ └── langgraph-agent/ # LangGraph stateful agent (port 8003)
├── scripts/
│ ├── setup.sh # Create venvs, install deps
│ ├── run-agents.sh # Launch all 3 agents (tmux or manual)
│ └── demo_driver.py # Send A2A tasks between agents
├── shared/
│ └── capiscio_events/ # Shared event emission module
├── .env.example # Environment template
└── README.md
```
## 架构
```
┌─────────────────────────────────────────────────────────┐
│ CapiscIO Registry (registry.capisc.io) │
│ ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│ │ Badge CA │ │ Events │ │ Agent Registry │ │
│ │ /v1/badge│ │ /v1/events│ │ /v1/sdk/agents │ │
│ └──────────┘ └──────────┘ └──────────────────┘ │
└───────────┬─────────────────────────┬───────────────────┘
│ │
┌──────┴──────┐ ┌──────────┴──────────┐
│Agent Guard │ │ MCP Guard │
├─────────────┤ ├─────────────────────┤
│ │ │ │
│ LangChain │ │ MCP Server │
│ :8001 │ │ MCPServerIdentity │
│ │ │ .connect() │
│ CrewAI │ │ + per-tool trust │
│ :8002 │ │ │ │
│ │ │ stdio│transport │
│ LangGraph │ │ ▼ │
│ :8003 │ │ MCP Client │
│ │ │ verifies server │
│ A2A Proto │ │ DID + badge │
└─────────────┘ └─────────────────────┘
```
每个代理获得自己的加密身份(DID)和密钥对。徽章由 CapiscIO 注册表 CA 签名。
## 安全配置
通过环境变量控制徽章强制执行:
| 变量 | 默认值 | 描述 |
|----------|---------|-------------|
| `SECURITY_MODE` | `ca` | `ca` 为 CA 签名徽章,`dev` 为自签名 |
| `CAPISCIO_REQUIRE_SIGNATURES` | `false` | 传入 A2A 请求需要有效徽章 |
| `CAPISCIO_FAIL_MODE` | `block` | 安全失败时的操作:`block`、`monitor` 或 `log` |
| `CAPISCIO_MIN_TRUST_LEVEL` | `0` | 所需最小信任等级(0-3) |
| `CAPISCIO_RATE_LIMITING` | `true` | 启用速率限制 |
| `CAPISCIO_RATE_LIMIT_RPM` | `60` | 每分钟请求限制 |
严格配置示例:
```
CAPISCIO_REQUIRE_SIGNATURES=true
CAPISCIO_FAIL_MODE=block
CAPISCIO_MIN_TRUST_LEVEL=1
```
## 事件类型
在仪表板中可见的事件:
| 事件类型 | 描述 |
|-------------|-------------|
| `agent.started` | 代理已初始化并就绪 |
| `badge.requested` | 已向 CA 请求徽章 |
| `badge.renewed` | 徽章由 keeper 自动续期 |
| `task.started` | A2A 任务执行开始 |
| `task.completed` | 任务成功完成 |
| `a2a.request` | 发出出站 A2A 调用 |
| `a2a.response` | 收到 A2A 响应 |
| `error` | 出错 |
## 快速测试
启动代理后,验证一切正常:
```
# 1. 检查所有代理是否健康
curl -s http://localhost:8001/health # LangChain
curl -s http://localhost:8002/health # CrewAI
curl -s http://localhost:8003/health # LangGraph
# 2. 发现代理能力
python scripts/demo_driver.py --discover
# 3. 测试单个代理(快速 - 无需 LLM 调用)
python scripts/demo_driver.py --agent langgraph --task "My login is broken"
# 预期输出:
# ✅ 任务在 0.0 秒内完成
# 📋 响应:
# 我理解您遇到了技术问题...
```
## 🔧 故障排除
| 问题 | 原因 | 修复 |
|---------|-------|-----|
| `RuntimeError: capiscio binary not found` | 核心二进制文件不可用 | SDK 首次运行时自动下载;检查网络连接 |
| 代理启动时 `ConnectionRefusedError` | 注册表不可达 | 检查 `.env` 中的 `CAPISCIO_SERVER_URL` 和网络连接 |
| `Port 8001 already in use` | 之前的代理仍在运行 | `lsof -ti:8001 \| xargs kill` |
| 代理启动但仪表板中无事件 | API 密钥或服务器 URL 错误 | 验证 `.env` 中的 `CAPISCIO_API_KEY` 和 `CAPISCIO_SERVER_URL` |
| `OPENAI_API_KEY not set` | 缺少 `.env` | `cp .env.example .env` 并填写密钥 |
| `ModuleNotFoundError: capiscio_sdk` | SDK 未在 venv 中安装 | `source .venv/bin/activate && pip install capiscio-sdk` |
| Pydantic V1 弃用警告 | 使用 Python 3.14+ | 可以忽略;功能仍然正常 |
## 📚 了解更多
- [CapiscIO 文档](https://docs.capisc.io)
- [A2A 协议规范](https://github.com/google/a2a)
- [RFC-002:信任徽章规范](https://github.com/capiscio/capiscio-rfcs)
- [Python SDK 参考](https://docs.capisc.io/sdk/python)
## 📄 许可证
MIT — 参见 [LICENSE](LICENSE)
标签:A2A协议, AI代理, API安全, Badge认证, DID, Docker, JSON输出, MCP, Python, Streamlit, 代理安全, 信任机制, 去中心化标识符, 安全防御评估, 安全防护, 工具授权, 微服务安全, 无后门, 策略即代码, 聊天机器人安全, 访问控制, 请求拦截, 运行时策略, 逆向工具, 零信任架构