Skip to content

SDKs

Three SDKs, one protocol. Cross-SDK signature compatibility is verified: TypeScript and Python produce identical signatures for identical inputs (same algorithm, same format, same key ordering).

Coverage matrix

API surface (15 total)TypeScriptPythonGo
Coverage13/15 (87%)12/15 (80%)9/15 (60%)

TypeScript - @sidianlabs/map

Best-supported surface. Developer preview.

bash
npm install @sidianlabs/map

Signers

typescript
import { HMACSigner, RSASigner, HTTPSigner } from '@sidianlabs/map';

// HMAC for shared-secret deployments
const hmac = new HMACSigner('your-secret');

// RSA for verified/regulated profiles (RS256 only)
const rsa = new RSASigner(privateKeyPem);

// HTTP request signing (nonce + timestamp headers)
const http = new HTTPSigner(keyId, secret);

WebSocket transport

Real-time dispatch and task status streaming with auto-reconnect:

typescript
import { WebSocketTransport } from '@sidianlabs/map';

const transport = new WebSocketTransport('ws://localhost:8787', {
  timeout: 30000,
  reconnect: true,
  reconnectIntervalMs: 1000,
  maxReconnectAttempts: 5,
  pingIntervalMs: 30000,
});

await transport.connect();

// Stream task status updates
for await (const update of await transport.streamTaskStatus('task-123')) {
  console.log('Task status:', update.status, update.message);
  if (update.status === 'completed' || update.status === 'failed') break;
}

transport.close();

Batch execution

typescript
const results = await client.dispatchBatch({ items: requests, parallel: true });

Error handling

All error codes are typed:

typescript
import type { ErrorCode } from '@sidianlabs/map';

try {
  await agent.run('payment.execute', input);
} catch (err) {
  if (err.code === 'approval_expired') { /* re-request approval */ }
  if (err.code === 'tenant_mismatch') { /* wrong tenant scope */ }
  if (err.code === 'idempotency_conflict') { /* already processed */ }
}

Observability

typescript
// OpenTelemetry tracing with scoped spans
import { Tracer, InMemorySpanExporter } from '@sidianlabs/map';

// Prometheus metrics (e.g. map_dispatch_total{capability="payment"} 1)
import { PrometheusMetricsCollector } from '@sidianlabs/map';

// Health checks: HTTP, WebSocket, TCP, custom
import { HealthCheckBuilder } from '@sidianlabs/map';

// Persistent storage (task + receipt stores, composable)
import { InMemoryTaskStore, InMemoryReceiptStore, CompositeStore } from '@sidianlabs/map';
const store = new CompositeStore({
  tasks: new InMemoryTaskStore(),
  receipts: new InMemoryReceiptStore(),
});

Python - mapprotocol

154 tests across 8 test files. Source install while in preview:

bash
pip install -e packages/python
python
from mapprotocol import Client

client = Client(base_url="http://localhost:8787")
client.configure_signing(key_id="your-key-id", secret="your-secret")
result = client.dispatch({...})

Go - mapproto

bash
go get github.com/SidianLabs/micro-agent-protocol/packages/go/mapproto
go
client := mapproto.NewClient("http://localhost:8787")
client.ConfigureSigning("your-key-id", "your-secret")
result, err := client.Dispatch(mapproto.DispatchRequest{...})

Signing model

JWS/MAPSIG compact serialization with JCS canonicalization and key rotation. HMAC-SHA256 for shared secrets, RSA-SHA256 for verified deployments.

Released under the Apache 2.0 License.