First running version

This commit is contained in:
qingjie.du
2026-03-30 17:39:13 +09:00
parent 5ffea3d849
commit bce2a5672c
67 changed files with 16503 additions and 0 deletions

125
README.md
View File

@@ -1,2 +1,127 @@
# MCPletA2A
MCPlet Agent Profile (A2A) platform implementation and reference implementation.
## Directory Structure
```
MCPletA2A/
├── platform_impl/ MCPlet Agent Profile Host platform
└── reference_impl/ Cancel-rate reduction scenario reference implementation
```
## Platform (`platform_impl`)
Implements the MCPlet Agent Profile Host as defined in MCPlet-spec-v202603-03.
Key components:
| Component | File | Role |
|-----------|------|------|
| MCPlet Host | `src/host/mcplet-host.ts` | Main orchestration entry point |
| Pool Registry | `src/pools/pool-registry.ts` | Pool membership + per-agent access enforcement |
| MCPlet Discovery | `src/discovery/mcplet-discovery.ts` | MCP tools/list + validation + hot-reload |
| LLM Adapter | `src/llm/` | LLM-agnostic interface, Claude implementation |
| Base Agent | `src/agents/base-agent.ts` | Abstract agent with Passkey interception + tool loop |
| Director Agent | `src/agents/director-agent.ts` | Cron-triggered, anti-concurrent, retry-safe |
| A2A Local Bus | `src/a2a/local-bus.ts` | In-process inter-agent message routing |
| A2A External Endpoint | `src/a2a/external-endpoint.ts` | HTTP endpoint for External Agents (Bearer auth) |
| Passkey Server | `src/passkey/passkey-server.ts` | localhost WebAuthn ceremony page |
| Dashboard | `src/dashboard/dashboard-server.ts` | Audit log + tool/agent visibility |
| Audit Log | `src/host/audit-log.ts` | In-memory action invocation log |
### Setup
```bash
cd platform_impl
npm install
npm run build
```
### Configuration
Copy and edit `config/platform.yaml`:
```bash
export ANTHROPIC_API_KEY=sk-ant-...
MCPLET_CONFIG=config/platform.yaml npm start
```
---
## Reference Implementation (`reference_impl`)
Demonstrates the cancel-rate reduction scenario from Flow.png.
### Flow
```
[cron 07:00] Director Agent
→ InfoGatheringAgent (info-pool)
fetch_web_content → 天気予報 (明日は雨)
call_external_api → デザート在庫
query_crm → 高キャンセル傾向顧客 5名
query_crm → 明日の予約 6件
→ PlanningAgent (pool-less)
query_erp → 在庫確認
→ 無料デザートキャンペーン立案
→ [店長 Passkey 承認]
→ DispatchAgent (media-pool)
send_email × 5 → 対象顧客にメール送信 (Passkey strict)
```
### MCPlet Inventory
| MCPlet | Tool | Type | Pool | Visibility |
|--------|------|------|------|------------|
| サイトアクセス | `read_site_stats` | read | media-pool | [model] |
| Email | `send_email` | action | media-pool | [app] |
| SNS | `post_sns` | action | media-pool | [app] |
| 外部Web | `fetch_web_content` | read | info-pool | [model] |
| 外部API | `call_external_api` | read | info-pool | [model] |
| CRM | `query_crm` | read | (none) | [model] |
| ERP | `query_erp` | read | (none) | [model] |
| HR | `query_hr` | read | (none) | [model] |
### Setup
```bash
cd reference_impl
npm install
npm run build
# Start mock services (port 5100)
npm run mock
```
### Running MCPlet Servers
Each MCPlet is a standalone MCP server started via stdio. Start all:
```bash
node dist/mcplets/info-pool/web-access/index.js
node dist/mcplets/info-pool/api-access/index.js
node dist/mcplets/internal/crm/index.js
node dist/mcplets/internal/erp/index.js
node dist/mcplets/internal/hr/index.js
node dist/mcplets/media-pool/site-access/index.js
node dist/mcplets/media-pool/email/index.js
node dist/mcplets/media-pool/sns/index.js
```
---
## Spec Compliance
| Requirement | Implementation |
|-------------|---------------|
| `mcpletType` declaration + enforcement | `MCPletDiscovery.validate()` rejects missing/invalid |
| Visibility filtering | `PoolRegistry.getToolsForAgent()` filters to `model`-visible for LLM |
| Per-agent Pool access | `PoolRegistry.canAgentAccess()` enforced in `BaseAgent.invokeMCPlet()` |
| action + model-visible + no auth → reject | `MCPletDiscovery.validate()` |
| Director Agent anti-concurrency | `DirectorAgent.running` flag |
| A2A local bus process-boundary | `A2ALocalBus` — in-memory only, no network |
| External Agent auth | Bearer token validation in `A2AExternalEndpoint` |
| Passkey Web Page (localhost mode) | Dynamic port, loopback-only, auto-close |
| action tool Passkey interception | `BaseAgent.invokeMCPlet()` Phase 2 intercept |
| Audit log for action tools | `AuditLog.record()` on every action invocation |