
टूल एक्सेस और एजेंट समन्वय के लिए एक एकीकृत, सुरक्षा-प्रथम वायर प्रोटोकॉल। UAP Ed25519-हस्ताक्षरित CapabilityCards, अनिवार्य mTLS, Keycloak IdP प्रमाणीकरण, और प्रति-कॉल अस्थायी Docker सैंडबॉक्सिंग का उपयोग करके CVE-2025-49596 और MCP टूल-पॉइज़निंग भेद्यता को समाप्त करता है।
██╗ ██╗ █████╗ ██████╗
██║ ██║██╔══██╗██╔══██╗
██║ ██║███████║██████╔╝
██║ ██║██╔══██║██╔═══╝
╚██████╔╝██║ ██║██║
╚═════╝ ╚═╝ ╚═╝╚═╝
Universal Agent Protocol
एक एकीकृत, सुरक्षा-प्रथम वायर प्रोटोकॉल उपकरण पहुँच, एजेंट समन्वय, और संरचित RPC के लिए। CVE-2025-49596 और उन टूल-पॉइज़निंग और सैंडबॉक्स-एस्केप भेद्यताओं को बंद करने के लिए बनाया गया है जिन्हें MCP ने संरचनात्मक रूप से खुला छोड़ दिया है।
git clone https://github.com/RajSidwadkar/UAP-protocol
cd UAP-protocol
npm install
npx tsx scripts/generate-keypair.ts
docker compose -f docker-compose.dev.yml up -d
curl http://localhost:3000/health
# {"status":"ok","version":"1.0.0"}
यह Keycloak को :8080 पर और UAP Gateway को :3000 पर शुरू करता है। गेटवे mTLS लागू करता है, Ed25519-हस्ताक्षरित CapabilityCards को सत्यापित करता है, और प्रत्येक टूल कॉल को एक अस्थायी Docker कंटेनर में चलाता है। उत्पन्न कुंजी जोड़ी के अलावा किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है।
graph TD
A[Client / Agent SDK] -->|mTLS + JWT + card_sig| B[UAP Gateway<br/>Fastify · port 3000]
B --> C{8-Stage Pipeline}
C --> C1[1 · Frame parse<br/>UapMessageFactory]
C1 --> C2[2 · Schema validate<br/>AJV against schema_ref]
C2 --> C3[3 · Token verify<br/>Keycloak JWKS · max 15 min]
C3 --> C4[4 · Scope enforce<br/>PermissionEnforcer]
C4 --> C5[5 · Card verify<br/>Ed25519 signature check]
C5 --> C6[6 · Sandbox execute<br/>Docker · CapDrop ALL · 128 MB]
C6 --> C7[7 · Audit emit<br/>AuditEventBus · non-blocking]
C7 --> C8[8 · Response<br/>UapResponseEnvelope]
B --> R[(Service Registry<br/>InMemory · Redis)]
B --> KC[(Keycloak IdP<br/>OAuth 2.1 · PKCE)]
B --> OT[(OpenTelemetry<br/>W3C TraceContext)]
B --> AU[(Audit Log<br/>append-only NDJSON)]हेक्सागोनल लेयर्स — डोमेन की शून्य I/O निर्भरताएँ हैं। हर इन्फ्रास्ट्रक्चर चिंता एक टाइप किए गए पोर्ट इंटरफ़ेस के पीछे बैठती है। Docker को WASM से, Keycloak को Auth0 से, Pino को SIEM एक्सपोर्टर से बदलें — डोमेन पर शून्य प्रभाव।
CVE-2025-49596 (अहस्ताक्षरित मेटाडेटा के माध्यम से टूल-पॉइज़निंग)। MCP टूल विवरण प्रकाशन के बाद परिवर्तनीय होते हैं। एक हमलावर तैनाती के बाद टूल नामों या विवरणों में दुर्भावनापूर्ण निर्देश इंजेक्ट कर सकता है — क्लाइंट के पास छेड़छाड़ का पता लगाने का कोई तरीका नहीं है। UAP सभी टूल मेटाडेटा को Ed25519-हस्ताक्षरित CapabilityCard पेलोड के अंदर रखता है। हस्ताक्षर के बाद कोई भी उत्परिवर्तन हस्ताक्षर को अमान्य कर देता है और गेटवे कुछ भी निष्पादित करने से पहले कार्ड को अस्वीकार कर देता है।
CWE-284 / सैंडबॉक्स-एस्केप वर्ग। MCP टूल को सर्वर प्रक्रिया स्तर पर चलाता है। किसी भी टूल में पथ ट्रैवर्सल या प्रक्रिया इंजेक्शन होस्ट फ़ाइलसिस्टम और नेटवर्क तक पहुँचता है। UAP प्रति कॉल एक नया Docker कंटेनर बनाता है — रीड-ओनली रूटफ़्स, CapDrop: ALL, 128 MB RAM सीमा, डिफ़ॉल्ट रूप से नेटवर्क अक्षम। कंटेनर प्रतिक्रिया के बाद नष्ट हो जाता है। कॉल के बीच कोई स्थायी आक्रमण सतह नहीं है।
CWE-287 / कन्फ्यूज्ड-डेप्युटी प्रमाणीकरण। MCP अपने स्वयं के OAuth प्रदाता के रूप में कार्य करता है, जो इसे संसाधन सर्वर और प्राधिकरण सर्वर दोनों बनाता है। यह क्लासिक कन्फ्यूज्ड-डेप्युटी पैटर्न है। UAP इन भूमिकाओं को अलग करता है: गेटवे एक शुद्ध संसाधन सर्वर है। Keycloak (या कोई बाहरी IdP) एकमात्र प्राधिकरण है। JWT को एक दूरस्थ JWKS एंडपॉइंट के विरुद्ध सत्यापित किया जाता है और 15 मिनट में हार्ड-कैप किया जाता है।
हर UAP संदेश एक ही लिफाफे का उपयोग करता है। auth ब्लॉक में एक स्कोप्ड JWT और एजेंट के हस्ताक्षरित CapabilityCard का संदर्भ होता है। गेटवे किसी भी एप्लिकेशन कोड तक पहुँचने से पहले दोनों को सत्यापित करता है।
{
"uap": {
"version": "1.0",
"type": "tool_call",
"id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
"trace": {
"traceparent": "00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01"
},
"auth": {
"token": "eyJhbGciOiJSUzI1NiJ9...",
"scope": ["tool:read"],
"card_sig": "ed25519:a1b2c3d4..."
}
},
"method": "tools/invoke",
"schema_ref": "uap:tool.invoke/v1",
"params": {
"tool_id": "db:query",
"input": { "sql": "SELECT 1" }
},
"ack": true
}
UAP-protocol/
├── packages/
│ ├── gateway/ @uap/gateway — Fastify-based UAP Gateway
│ ├── sdk-ts/ @uap/sdk-ts — TypeScript client + server SDK
│ └── sdk-py/ uap-sdk — Python async SDK (httpx + FastAPI)
├── scripts/
│ ├── generate-keypair.ts — Ed25519 keypair for local dev
│ └── keycloak-bootstrap.ts — Idempotent Keycloak realm setup
└── docker/
└── sandbox/ — Base image for zero-trust tool execution
import { UapClient, ClientCredentialsTokenProvider } from "@uap/sdk-ts";
const client = new UapClient({
gatewayUrl: "https://gateway.example.com",
tokenProvider: new ClientCredentialsTokenProvider({
tokenUrl: process.env.TOKEN_URL!,
clientId: process.env.CLIENT_ID!,
clientSecret: process.env.CLIENT_SECRET!,
}),
});
const result = await client.invokeTool(
"db:query",
{ sql: "SELECT * FROM users LIMIT 10" },
["tool:read"]
);
const task = await client.delegateTask(
"summarizer",
{ text: "..." },
["task:submit"]
);
from uap_sdk.client import UapClient, UapClientOptions
from uap_sdk.token import ClientCredentialsTokenProvider
async with UapClient(UapClientOptions(
gateway_url="https://gateway.example.com",
token_provider=ClientCredentialsTokenProvider(
token_url=os.environ["TOKEN_URL"],
client_id=os.environ["CLIENT_ID"],
client_secret=os.environ["CLIENT_SECRET"],
)
)) as client:
result = await client.invoke_tool("db:query", {"sql": "SELECT 1"}, ["tool:read"])
FastAPI मिडलवेयर
from uap_sdk.middleware import uap_auth
@app.post("/summarize")
@uap_auth(scope=["task:submit"])
async def summarize(request: Request):
claims = request.state.uap_claims # typed AuthClaims
...
uap-migrate CLI किसी भी MCP सर्वर को 5 मिनट से भी कम समय में एक हस्ताक्षरित UAP CapabilityCard के रूप में लपेटता है। इडेम्पोटेंट — पहले से माइग्रेट किए गए सर्वर पर पुनः चलाना कोई क्रिया नहीं है।
node dist/cli/migrate.js mcp http://localhost:3001 \
--issuer did:uap:my-org \
--key config/dev.privkey.hex \
--out ./uap-cards
# → ./uap-cards/did:uap:my-org.card.json
उपकरण नाम, विवरण और पैरामीटर स्कीमा Ed25519-हस्ताक्षरित पेलोड का हिस्सा हैं। हस्ताक्षर के बाद किसी भी फ़ील्ड को उत्परिवर्तित करने से हस्ताक्षर अमान्य हो जाता है — संरचनात्मक रूप से टूल-पॉइज़निंग को पराजित करता है।
const signed = await signer.sign({
issuer: "did:uap:my-agent",
version: "1.0.0",
tools: [{
id: "db:query",
description: "Run a read-only SQL query",
inputSchema: { type: "object", required: ["sql"] },
scopes: ["tool:read"]
}],
scopes: ["tool:read"],
issuedAt: Date.now(),
expiresAt: Date.now() + 86_400_000 * 30
});
// signed.signature === "ed25519:a1b2c3..."
शाखा नामकरण: feat/<sprint>-<task>-<slug> — उदा. feat/s2-2.1-mtls-keycloak
प्रत्येक परिवर्तन इस प्रकार है: शाखा → स्थानीय रूप से npx tsc --noEmit + npx vitest run → कमिट → PR → स्क्वैश मर्ज → शाखा हटाएं। स्थानीय विकास के लिए कोई CI निर्भरता नहीं है।
# Run all tests before committing
cd packages/gateway && npx vitest run
cd packages/sdk-ts && npx vitest run
cd packages/sdk-py && python -m pytest tests/ -v
रोडमैप: स्प्रिंट 0 (स्कैफ़ोल्ड) → स्प्रिंट 1 (स्कीमा + हस्ताक्षर + RPC) → स्प्रिंट 2 (सुरक्षा कोर) → स्प्रिंट 3 (गेटवे + रजिस्ट्री) → स्प्रिंट 4 (ब्रिज एडाप्टर्स) → स्प्रिंट 5 (SDKs + Docker छवि)।
UAP · Universal Agent Protocol · 2026
SPDX-License-Identifier: Apache-2.0
| लेयर | सामग्री | निर्भरताएँ |
|---|
| Domain | UapEnvelope, CapabilityCard, AuditEvent, Task | कोई नहीं — केवल stdlib |
| Application | InvokeToolUseCase, DelegateTaskUseCase, ValidateCardUseCase | केवल डोमेन पोर्ट |
| Infrastructure | KeycloakAuthAdapter, DockerSandboxAdapter, Ed25519SignerAdapter, PinoAuditAdapter | ऐप पोर्ट + बाहरी लाइब्रेरीज़ |
| Transport | UAP-RPC फ्रेम पार्सर, Fastify गेटवे, SSE/WebSocket हैंडलर्स | इन्फ्रास्ट्रक्चर + डोमेन सीरियलाइज़र |
| सुविधा | UAP | MCP | A2A | JSON-RPC 2.0 |
|---|
| अनिवार्य प्रमाणीकरण | ✅ mTLS + JWT हमेशा | ❌ वैकल्पिक | ⚠️ केवल API कुंजी | ❌ कोई नहीं |
| टूल मेटाडेटा अखंडता | ✅ Ed25519-हस्ताक्षरित पेलोड | ❌ प्रकाशन के बाद उत्परिवर्तन संभव | ❌ कोई हस्ताक्षर नहीं | ❌ कोई हस्ताक्षर नहीं |
| सैंडबॉक्स मॉडल | ✅ प्रति कॉल अस्थायी Docker | ⚠️ केवल सर्वर-स्तर | ❌ कोई नहीं | ❌ कोई नहीं |
| एजेंट खोज | ✅ हब-एंड-स्पोक · N कनेक्शन | ❌ N² प्रत्यक्ष HTTP | ⚠️ DNS-आधारित | ❌ कोई नहीं |
| ऑडिट ट्रेल | ✅ प्रोटोकॉल-मूल एपेंड-ओनली लॉग | ❌ कोई नहीं | ❌ कोई नहीं | ❌ कोई नहीं |
| वितरित ट्रेसिंग | ✅ W3C TraceContext अनिवार्य | ❌ कोई नहीं | ❌ कोई नहीं | ❌ कोई नहीं |
| स्कीमा सत्यापन | ✅ परिवहन स्तर पर AJV | ⚠️ वैकल्पिक Zod | ❌ कोई नहीं | ❌ कोई नहीं |
| टोकन जीवनकाल सीमा | ✅ 15 मिनट लागू | ❌ लागू नहीं | ❌ लागू नहीं | ❌ N/A |
| बैच सिमेंटिक्स | ✅ सीरियल · समानांतर · लेन-देन | ❌ अपरिभाषित | ❌ कोई नहीं | ⚠️ अस्पष्ट |
| बाइनरी पेलोड | ✅ मूल फ़्रेम | ❌ केवल Base64 | ❌ केवल Base64 | ❌ केवल Base64 |
| IdP मॉडल | ✅ केवल बाहरी IdP | ❌ सर्वर अपना स्वयं का OAuth प्रदाता है | ⚠️ भिन्न | ❌ कोई नहीं |
| ब्रिज एडाप्टर | ✅ MCP + A2A ब्रिज चरण 2 में शामिल हैं | ❌ कोई ब्रिज नहीं | ❌ कोई ब्रिज नहीं | ❌ कोई ब्रिज नहीं |
| क्षैतिज स्केल | ✅ स्टेटलेस · कोई भी लोड बैलेंसर | ❌ स्टिकी सत्र | ⚠️ भिन्न | ❌ कोई नहीं |
| चर | विवरण | डिफ़ॉल्ट |
|---|
KEYCLOAK_URL | Keycloak आधार URL | http://localhost:8080 |
KEYCLOAK_REALM | रियल्म नाम | uap |
UAP_AUDIENCE | JWT श्रोता दावा | uap-gateway |
UAP_SIGNING_KEY_PATH | Ed25519 निजी कुंजी हेक्स का पथ | config/dev.privkey.hex |
UAP_DOCKER_SOCKET | Docker सॉकेट पथ | /var/run/docker.sock |
UAP_AUDIT_LOG_DIR | एपेंड-ओनली ऑडिट NDJSON लॉग निर्देशिका | /var/log/uap |
UAP_GATEWAY_PORT | गेटवे सुनने का पोर्ट | 3000 |
UAP_MTLS_CERT | सर्वर TLS प्रमाणपत्र (PEM) | certs/server.crt |
UAP_MTLS_KEY | सर्वर TLS निजी कुंजी (PEM) | certs/server.key |
UAP_MTLS_CA | क्लाइंट प्रमाणपत्र सत्यापन के लिए CA प्रमाणपत्र | certs/ca.crt |
OTEL_EXPORTER_OTLP_ENDPOINT | OpenTelemetry कलेक्टर एंडपॉइंट | http://localhost:4318 |
REDIS_URL | बहु-उदाहरण रजिस्ट्री के लिए Redis (वैकल्पिक) | — |
| पैकेज | संस्करण | उद्देश्य |
|---|
fastify | ^4.27 | गेटवे HTTP सर्वर |
zod | ^3.23 | लिफाफा स्कीमा और प्रकार अनुमान |
@noble/curves | ^1.4 | Ed25519 हस्ताक्षर |
jose | ^5.4 | JWT सत्यापन, JWKS क्लाइंट |
ajv | ^8.16 | परिवहन-स्तर पैरामीटर सत्यापन |
dockerode | ^4.0 | शून्य-विश्वास सैंडबॉक्स एडाप्टर |
pino | ^9.2 | एपेंड-ओनली संरचित ऑडिट लॉग |
ulid | ^2.3 | क्रमबद्ध अद्वितीय ID |
@opentelemetry/sdk-node | ^0.52 | वितरित ट्रेसिंग |
ioredis | ^5.3 | बहु-उदाहरण सेवा रजिस्ट्री |
@modelcontextprotocol/sdk | ^1.0 | MCP ब्रिज एडाप्टर |
httpx (Python) | ^0.27 | Python SDK के लिए एसिंक HTTP क्लाइंट |
pydantic (Python) | ^2.7 | Python प्रकार सत्यापन |