TypeScript SDK for the Agentic Discovery Commerce Protocol (AdCP).
npm install @protocol-commerce/adcp-sdkimport { AdcpClient } from '@protocol-commerce/adcp-sdk';
const client = new AdcpClient({
serverUrl: 'https://mcp.nexbid.dev',
apiKey: 'your-api-key',
});
// Search for products
const results = await client.search({
query: 'organic olive oil',
intent: 'purchase',
geo: 'CH',
maxResults: 5,
});
for (const product of results.products) {
console.log(`${product.title} — ${product.price.amount} ${product.price.currency}`);
if (product.sponsored) console.log(' [Sponsored]');
}
// Get product details
const detail = await client.product({ product_id: results.products[0].id });
console.log(`Available in: ${detail.geoScope.join(', ')}`);
// Browse categories
const categories = await client.categories({ geo: 'CH' });
for (const cat of categories.categories) {
console.log(`${cat.category}: ${cat.productCount} products`);
}All message types have Zod validators for runtime type checking:
import { searchParamsSchema, productResultSchema } from '@protocol-commerce/adcp-sdk';
// Validate search input
const params = searchParamsSchema.parse({
query: 'running shoes',
intent: 'purchase',
geo: 'de', // auto-uppercased to 'DE'
});
// Validate server response
const product = productResultSchema.parse(serverResponse);Reference implementation of the public scoring formula:
import { calculateScore, normalizeBid, DEFAULT_SCORING_WEIGHTS } from '@protocol-commerce/adcp-sdk';
const score = calculateScore(
normalizeBid(50, 100), // bid: 50 cents, max bid: 100 cents → 0.5
0.85, // similarity: 85%
0.7, // quality: 70%
);
// score = 0.4 * 0.5 + 0.4 * 0.85 + 0.2 * 0.7 = 0.68All protocol types are exported:
import type {
SearchParams,
ProductResult,
SearchResponse,
ProductDetail,
AttributionEvent,
ScoringWeights,
Currency,
Availability,
SearchIntent,
} from '@protocol-commerce/adcp-sdk';| Method | Description | Returns |
|---|---|---|
search(params) |
Product search with optional filters | SearchResponse |
product(params) |
Get product details by UUID | ProductDetail |
categories(params?) |
List categories with product counts | CategoriesResponse |
Custom error class with protocol error codes:
import { AdcpClient, AdcpError } from '@protocol-commerce/adcp-sdk';
try {
await client.search({ query: 'test' });
} catch (err) {
if (err instanceof AdcpError) {
console.log(err.code); // 'UNAUTHORIZED', 'RATE_LIMITED', etc.
console.log(err.message); // Human-readable description
}
}- Node.js: 18+
- Runtime: Any environment with
fetchandcrypto.randomUUID - MCP version: 2024-11-05+
- Dependencies:
zod(runtime validation only)
MIT