TypeScript Integration
An official TypeScript SDK is on the roadmap. For now, use the REST API directly with
fetch(). The examples below show you how.Which endpoint? ASG exposes two protocols:
- REST (
/v1/mcp/tools/call) — recommended for quickstart and most integrations. See Python SDK for REST examples. - JSON-RPC (
/mcp) — for MCP-native agent frameworks. The examples on this page use JSON-RPC since TypeScript is the primary MCP SDK language.
Authorization: Bearer <api_key> header.Quick Start
Copy
const ASG_ENDPOINT = 'https://agent.asgcompute.com/mcp';
const API_KEY = process.env.ASG_API_KEY!;
// Step 1: Call a tool (will return 402 with quote)
async function callTool(name: string, args: Record<string, unknown>) {
const response = await fetch(ASG_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: { name, arguments: args }
})
});
if (response.status === 402) {
const quote = await response.json();
// quote.payment_instructions has pay_to, usdc_mint, network
// Build and submit Solana USDC transfer, then retry:
return quote;
}
return response.json();
}
// Step 2: Retry with payment proof
async function callToolWithPayment(
name: string,
args: Record<string, unknown>,
paymentProof: string // base64url-encoded JSON
) {
const response = await fetch(ASG_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`,
'X-Payment': paymentProof
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: { name, arguments: args }
})
});
return response.json();
}
List Available Tools
Copy
async function listTools() {
const response = await fetch(ASG_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/list'
})
});
const data = await response.json();
return data.result.tools;
// [{ name: 'inference_chat', description: '...' }, ...]
}
Inference Example
Copy
// Get a quote for inference
const quote = await callTool('inference_chat', {
model: 'openai/gpt-4o-mini',
messages: [{ role: 'user', content: 'Hello!' }]
});
console.log(`Price: ${quote.quote.price_display}`);
// "Price: $0.0024"
// After paying on Solana, retry with X-Payment header
const result = await callToolWithPayment(
'inference_chat',
{
model: 'openai/gpt-4o-mini',
messages: [{ role: 'user', content: 'Hello!' }]
},
paymentProof
);
console.log(result.result.content);
Error Handling
Copy
async function reliableCall(name: string, args: Record<string, unknown>, maxRetries = 3) {
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
const response = await fetch(ASG_ENDPOINT, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${API_KEY}`
},
body: JSON.stringify({
jsonrpc: '2.0', id: 1,
method: 'tools/call',
params: { name, arguments: args }
})
});
const data = await response.json();
if (data.error?.code === 'QUOTE_EXPIRED') {
continue; // Retry with fresh quote
}
if (data.error?.code === 'RATE_LIMITED') {
await new Promise(r => setTimeout(r, 1000 * (attempt + 1)));
continue;
}
return data;
} catch (err) {
if (attempt === maxRetries - 1) throw err;
}
}
throw new Error('Max retries exceeded');
}
Payment Proof Format
TheX-Payment header contains a base64url-encoded JSON object:
Copy
const paymentProof = btoa(JSON.stringify({
tx_signature: '5Uj3...', // Solana transaction signature
quote_id: 'qt_xyz789' // Quote ID from 402 response
}));
Next Steps
Examples
More working examples
API Reference
Complete API documentation