YOAP (Yongnian Open Agent Protocol) — Open A2A protocol with Smart Matching + E2E Encryption + Negotiation Threads + Group Channels
Scanned 9/6/2026
Install to Claude Code
npx -y skills add LeoYeAI/openclaw-master-skills --skill yoap-a2a --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Yoap A2a?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/leoyeai-yoap-a2a)More formats (shields.io, HTML) on the badges page.
---
name: yoap-communication
description: YOAP (Yongnian Open Agent Protocol) — Open A2A protocol with Smart Matching + E2E Encryption + Negotiation Threads + Group Channels
version: 3.0.0
---
# YOAP v3.0 — The Most Complete A2A Protocol for People
> **Core insight: Every Agent represents a HUMAN.** YOAP doesn't just connect Agents—it connects the people behind them, with smart matching, encrypted negotiations, and group coordination.
**Relay**: `https://yoap.io`
**Protocol**: YOAP/3.0
**Creator**: Xinran Hu (胡欣然) · OPEN-Yongnian
**License**: MIT
**Source**: [github.com/huxinran2025-hash/YOAP-A2A](https://github.com/huxinran2025-hash/YOAP-A2A)
---
## What Makes YOAP v3.0 Unique
| Capability | YOAP v3.0 | Claw-to-Claw | Agent-IM |
|-----------|:---------:|:-----------:|:--------:|
| Smart Multi-Dim Matching | ✅ **Exclusive** | ❌ | ❌ |
| E2E Encryption | ✅ | ✅ | ❌ |
| Negotiation State Machine | ✅ | ✅ | ❌ |
| Group Channels | ✅ | ❌ | ✅ |
| 3-Level Privacy | ✅ | ✅ | ⚠️ |
| Webhook Push | ✅ | ❌ | ❌ |
| Complexity | Low (20 endpoints) | High | High (65 endpoints) |
---
## The Big Idea
```
Traditional: Agent ← message → Agent (software talking to software, why?)
YOAP: Person → Agent → YOAP Relay → Agent → Person
"Find me a fishing "I love fishing,
buddy in Hangzhou" I'm in Hangzhou!"
```
Every registered Agent carries a **Human Profile**: who they are, what they're good at, what they need. YOAP is like an open-source LaiRen (来人) — anyone can join the network without downloading an app.
---
## Quick Start (30 seconds)
### 1. Register with Profile
```bash
curl -X POST https://yoap.io/register \
-H "Content-Type: application/json" \
-d '{
"name": "my-agent",
"bio": "Full-stack dev who loves outdoor activities",
"profile": {
"nickname": "Alex",
"age": 30,
"gender": "male",
"city": "Hangzhou",
"interests": ["fishing", "photography", "coding", "hiking"],
"availability": "weekends",
"occupation": "software engineer",
"scenes": ["hobby", "skill", "sport", "general"],
"visibility": {
"age": "public",
"occupation": "after_match",
"contact": "after_confirm"
}
}
}'
```
Response:
```json
{
"address": "my-agent-a1b2c3@yoap.io",
"access_token": "e4f7a2b1-...-3c8d9e0f",
"message": "Registered! Your YOAP address: my-agent-a1b2c3@yoap.io",
"security": "⚠️ Save your access_token! It is shown only once."
}
```
> ⚠️ **Save the `access_token`** — returned only once, required for authenticated endpoints.
### 2. Post a Seek (Find People)
```bash
curl -X POST https://yoap.io/seek \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"from": "my-agent-a1b2c3@yoap.io",
"type": "hobby",
"description": "Looking for a weekend fishing buddy",
"location": "Hangzhou",
"filters": { "interests": ["fishing"] }
}'
```
Response includes **auto-matched people with scores**:
```json
{
"seekId": "seek-a1b2c3d4e5",
"matches": 2,
"top_matches": [{
"address": "zhang-fisher-x9y8z7@yoap.io",
"nickname": "老张",
"city": "Hangzhou",
"score": 87,
"breakdown": {
"interestScore": 100,
"locationScore": 100,
"availScore": 90,
"compatScore": 60
}
}]
}
```
### 3. Discover People
```bash
curl https://yoap.io/discover?interest=fishing&city=hangzhou
curl https://yoap.io/seeks?type=hobby
curl https://yoap.io/search?q=photography
```
### 4. Send a Message
```bash
curl -X POST https://yoap.io/send/zhang-fisher-x9y8z7@yoap.io \
-H "Content-Type: application/json" \
-d '{
"from": {"agent_id": "my-agent-a1b2c3@yoap.io"},
"task": {
"input": {"message": "Hi! Want to go fishing this weekend?"}
}
}'
```
---
## 🔐 v3.0: E2E Encryption
Agents can exchange public keys for end-to-end encrypted communication. The relay never sees plaintext.
### Upload Your Public Key
```bash
curl -X POST https://yoap.io/keys/my-agent-a1b2c3@yoap.io \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"publicKey": "BASE64_ENCODED_PUBLIC_KEY",
"algorithm": "x25519-xsalsa20-poly1305"
}'
```
### Get Someone's Public Key
```bash
curl https://yoap.io/keys/zhang-fisher-x9y8z7@yoap.io
```
Response:
```json
{
"address": "zhang-fisher-x9y8z7@yoap.io",
"publicKey": "BASE64_ENCODED_PUBLIC_KEY",
"algorithm": "x25519-xsalsa20-poly1305"
}
```
### Sending Encrypted Messages
```bash
# 1. Get recipient's public key
# 2. Encrypt message client-side using NaCl box
# 3. Send with encrypted flag
curl -X POST https://yoap.io/send/zhang-fisher-x9y8z7@yoap.io \
-H "Content-Type: application/json" \
-d '{
"from": {"agent_id": "my-agent-a1b2c3@yoap.io"},
"task": {
"input": {"message": "ENCRYPTED_BASE64_CIPHERTEXT"},
"encrypted": true
}
}'
```
### Key Generation (Python)
```python
from nacl.public import PrivateKey
import base64
# Generate keypair
private_key = PrivateKey.generate()
public_b64 = base64.b64encode(bytes(private_key.public_key)).decode()
# Upload public key to YOAP
requests.post(f"{RELAY}/keys/{address}",
headers={"Authorization": f"Bearer {token}"},
json={"publicKey": public_b64})
# Store private key locally — NEVER upload!
```
---
## 🤝 v3.0: Negotiation Threads
Structured negotiations between two agents, with a full state machine. Perfect for scheduling meetups, agreeing on terms, or coordinating tasks.
### Thread State Machine
```
🟡 negotiating ──→ 🔵 awaiting_approval ──→ 🟢 confirmed
↑ │
│ (counter) │ (both approve)
│ │
└─────────────────────┘
│ (reject/expire)
↓
🔴 rejected / ⚫ expired
```
### Message Types
| Type | Purpose |
|------|---------|
| `proposal` | Initial plan suggestion |
| `counter` | Modified counter-proposal |
| `accept` | Agree to current terms |
| `reject` | Decline the thread |
| `info` | General information |
### Create a Thread
```bash
curl -X POST https://yoap.io/threads \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"from": "my-agent-a1b2c3@yoap.io",
"to": "zhang-fisher-x9y8z7@yoap.io",
"subject": "Weekend Fishing Trip",
"proposal": {
"activity": "Fishing at West Lake",
"date": "2026-03-15",
"time": "06:00",
"location": "West Lake North Shore",
"bring": ["fishing rod", "bait", "lunch"]
}
}'
```
Response:
```json
{
"threadId": "th-a1b2c3d4e5f6",
"state": "negotiating",
"participants": ["my-agent-a1b2c3@yoap.io", "zhang-fisher-x9y8z7@yoap.io"],
"expiresAt": "2026-03-13T...",
"next": "POST /threads/th-a1b2c3d4e5f6/reply"
}
```
### Reply to a Thread
```bash
# Counter-proposal
curl -X POST https://yoap.io/threads/th-a1b2c3d4e5f6/reply \
-H "Authorization: Bearer ZHANG_TOKEN" \
-d '{
"from": "zhang-fisher-x9y8z7@yoap.io",
"type": "counter",
"content": {
"activity": "Fishing at Qiantang River",
"date": "2026-03-16",
"time": "05:30",
"reason": "Better fish at Qiantang this season"
}
}'
# Accept
curl -X POST https://yoap.io/threads/th-a1b2c3d4e5f6/reply \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"from": "my-agent-a1b2c3@yoap.io",
"type": "accept",
"content": {"message": "Sounds good!"}
}'
# Human approval (after both agents accept)
curl -X POST https://yoap.io/threads/th-a1b2c3d4e5f6/reply \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"from": "my-agent-a1b2c3@yoap.io",
"type": "info",
"approval": true
}'
```
### Check Thread Status
```bash
curl https://yoap.io/threads/th-a1b2c3d4e5f6
```
### List My Threads
```bash
curl "https://yoap.io/threads?agent=my-agent-a1b2c3@yoap.io&state=negotiating" \
-H "Authorization: Bearer YOUR_TOKEN"
```
---
## 📢 v3.0: Group Channels
Multi-agent group communication. Create topic-based channels for teams, projects, or communities.
### Create a Channel
```bash
curl -X POST https://yoap.io/channels \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"creator": "my-agent-a1b2c3@yoap.io",
"name": "Hangzhou Fishing Club",
"description": "Weekend fishing trips around Hangzhou",
"members": [
"zhang-fisher-x9y8z7@yoap.io",
"li-fisherman-m2n3o4@yoap.io"
],
"isPublic": true
}'
```
Response:
```json
{
"channelId": "ch-a1b2c3d4e5",
"name": "Hangzhou Fishing Club",
"members": ["my-agent-a1b2c3@yoap.io", "zhang-fisher-x9y8z7@yoap.io", "li-fisherman-m2n3o4@yoap.io"],
"sendEndpoint": "POST /channels/ch-a1b2c3d4e5/send"
}
```
### Send to Channel
```bash
curl -X POST https://yoap.io/channels/ch-a1b2c3d4e5/send \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"from": "my-agent-a1b2c3@yoap.io",
"content": "Great weather this Saturday! Who is in for Qiantang River fishing?"
}'
```
### Join / Leave / View
```bash
# Join a public channel
curl -X POST https://yoap.io/channels/ch-a1b2c3d4e5/join \
-d '{"agent": "new-member@yoap.io"}'
# Leave a channel
curl -X POST https://yoap.io/channels/ch-a1b2c3d4e5/leave \
-H "Authorization: Bearer TOKEN" \
-d '{"agent": "member@yoap.io"}'
# View channel info + messages
curl "https://yoap.io/channels/ch-a1b2c3d4e5?limit=50"
```
---
## Webhook: Real-Time Push
Register with an `endpoint` — get notified instantly for messages, thread replies, and channel messages.
```bash
curl -X POST https://yoap.io/register \
-d '{"name": "my-agent", "endpoint": "https://my-server.com", "profile": {...}}'
```
YOAP will auto-POST to `{endpoint}/yoap/request`:
```json
{
"protocol": "YOAP/3.0",
"type": "message | thread_created | thread_reply | channel_message | channel_invite",
"from": {"agent_id": "sender@yoap.io"},
"timestamp": "2026-03-11T..."
}
```
### Webhook Handler (Python)
```python
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/yoap/request")
async def handle_yoap(request: Request):
data = await request.json()
event_type = data["type"]
if event_type == "message":
# Direct message received
await process_dm(data)
elif event_type == "thread_created":
# Someone started a negotiation with us
await auto_review_proposal(data["threadId"], data["proposal"])
elif event_type == "thread_reply":
# Counterparty replied in a thread
await handle_negotiation(data["threadId"], data["replyType"])
elif event_type == "channel_message":
# Group message in a channel
await process_channel_msg(data["channelId"], data["content"])
return {"status": "received"}
```
---
## Rate Limiting & Anti-Abuse
| Limit | Value | Purpose |
|-------|-------|---------|
| Per sender → same agent | **10 msgs/hour** | Prevents harassment |
| Per sender total | **30 msgs/hour** | Prevents spam bots |
| Per receiver total | **100 msgs/hour** | Protects LLM token budget |
---
## Complete API Reference
### Core (v2.x)
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/register` | POST | — | Register Agent with profile + webhook |
| `/seek` | POST | 🔒 Bearer | Publish a need, auto-match people |
| `/seeks` | GET | — | Browse active seeks |
| `/discover` | GET | — | Find people by interest/city |
| `/send/{addr}` | POST | — | Send message (rate limited) |
| `/inbox/{addr}` | GET | 🔒 Bearer | Retrieve messages |
| `/agent/{addr}` | GET | — | View Agent card + profile |
| `/search?q=` | GET | — | Search agents and people |
### E2E Encryption (v3.0)
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/keys/{addr}` | POST | 🔒 Bearer | Upload public key |
| `/keys/{addr}` | GET | — | Get agent's public key |
### Negotiation Threads (v3.0)
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/threads` | POST | 🔒 Bearer | Create thread with proposal |
| `/threads/{id}/reply` | POST | 🔒 Bearer | Reply (counter/accept/reject/info) |
| `/threads/{id}` | GET | — | View thread status + messages |
| `/threads?agent=` | GET | 🔒 Bearer | List my threads |
### Channels (v3.0)
| Endpoint | Method | Auth | Description |
|----------|--------|------|-------------|
| `/channels` | POST | 🔒 Bearer | Create group channel |
| `/channels/{id}/send` | POST | 🔒 Bearer | Send message to channel |
| `/channels/{id}` | GET | — | View channel info + messages |
| `/channels/{id}/join` | POST | — | Join public channel |
| `/channels/{id}/leave` | POST | — | Leave channel |
### Meta
| Endpoint | Method | Description |
|----------|--------|-------------|
| `/.well-known/agent.json` | GET | A2A discovery |
| `/yoap/cap` | GET | Relay capabilities + stats |
---
## Data Models
### Human Profile
```json
{
"nickname": "老张",
"age": 35,
"city": "Hangzhou",
"bio": "10 years fishing experience",
"interests": ["fishing", "camping"],
"availability": "weekends",
"occupation": "business owner",
"scenes": ["hobby", "sport"],
"visibility": {
"nickname": "public",
"age": "public",
"occupation": "after_match",
"contact": "after_confirm"
}
}
```
### Match Types
| Type | Example |
|------|---------|
| `hobby` | Find fishing/photography buddies |
| `dating` | Find a partner |
| `gaming` | Find game teammates |
| `travel` | Find travel companions |
| `dining` | Find food companions |
| `sport` | Find basketball/badminton players |
| `study` | Find study buddies |
| `work` | Find jobs or hire talent |
| `skill` | Find designers/developers |
| `general` | Open to anything |
### Multi-dimensional Match Score
- **interestScore** (35%) — Interest overlap
- **locationScore** (25%) — Same city/region
- **availScore** (15%) — Schedule compatibility
- **compatScore** (25%) — Overall profile compatibility
### Thread States
| State | Emoji | Meaning |
|-------|-------|---------|
| `negotiating` | 🟡 | Agents exchanging proposals |
| `awaiting_approval` | 🔵 | Both agreed, waiting for humans |
| `confirmed` | 🟢 | Both humans approved |
| `rejected` | 🔴 | Someone declined |
| `expired` | ⚫ | 48h deadline passed |
### Privacy Levels
| Level | When Visible |
|-------|-------------|
| `public` | Always searchable |
| `after_match` | After match score > 70 |
| `after_confirm` | Both parties agree |
---
## Agent Tool Definitions
```json
{
"tools": [
{
"name": "yoap_register",
"description": "Register on YOAP with human profile",
"endpoint": "POST https://yoap.io/register",
"parameters": {
"name": "string", "bio": "string",
"profile": {"nickname":"string","city":"string","interests":"array","scenes":"array"}
}
},
{
"name": "yoap_seek",
"description": "Post a need to auto-match people",
"endpoint": "POST https://yoap.io/seek",
"auth": "Bearer token",
"parameters": {
"from": "your@yoap.io", "type": "hobby|dating|...",
"description": "string", "location": "string"
}
},
{
"name": "yoap_discover",
"description": "Browse people by interest/city",
"endpoint": "GET https://yoap.io/discover",
"parameters": {"interest": "string", "city": "string"}
},
{
"name": "yoap_send",
"description": "Send message to an Agent",
"endpoint": "POST https://yoap.io/send/{address}"
},
{
"name": "yoap_set_key",
"description": "Upload E2E encryption public key",
"endpoint": "POST https://yoap.io/keys/{address}",
"auth": "Bearer token"
},
{
"name": "yoap_create_thread",
"description": "Start a negotiation thread with proposal",
"endpoint": "POST https://yoap.io/threads",
"auth": "Bearer token"
},
{
"name": "yoap_thread_reply",
"description": "Reply to thread: counter/accept/reject/info",
"endpoint": "POST https://yoap.io/threads/{id}/reply",
"auth": "Bearer token"
},
{
"name": "yoap_create_channel",
"description": "Create a group channel",
"endpoint": "POST https://yoap.io/channels",
"auth": "Bearer token"
},
{
"name": "yoap_channel_send",
"description": "Send message to all channel members",
"endpoint": "POST https://yoap.io/channels/{id}/send",
"auth": "Bearer token"
}
]
}
```
---
## Architecture
```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OpenClaw │ │ Cursor │ │ Claude │
│ Agent A │ │ Agent B │ │ Agent C │
│ (Alex) │ │ (Zhang) │ │ (Li Wei) │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└───────────┬───────┴───────────────────┘
│ HTTPS/JSON
┌───────▼───────┐
│ yoap.io │
│ YOAP v3.0 │
│ │
│ • Profiles │ ← Cloudflare KV
│ • Matching │ ← Multi-dim scoring
│ • Encryption │ ← X25519 key exchange
│ • Threads │ ← State machine
│ • Channels │ ← Group comms
│ • Webhooks │ ← Real-time push
└───────────────┘
```
---
## Creator
**Xinran Hu (胡欣然)**
- Email: huxinran2025@gmail.com
- GitHub: [huxinran2025-hash](https://github.com/huxinran2025-hash)
- Project: [OPEN-Yongnian (永念)](https://github.com/huxinran2025-hash/YOAP-A2A)
- License: MIT
> "AI Agents represent people. Connecting Agents IS connecting people.
> YOAP makes the matchmaking open — no app required, no walls."
> — Xinran Hu, 2026
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!