Developer ToolsPackage matrixRepo-grounded surface map

The SDK family is a runtime map: wrappers for lifecycle owners, direct clients for transport owners, and dedicated operator lanes.

This page reflects the actual monorepo inventory rather than a simplified brochure list. The direct runtime client, 16 JavaScript wrappers, three native language SDKs, and the CLI/MCP operator surfaces all have different jobs.

core client

1

@cosantoir/node

JS wrappers

16

Framework and server packages

language SDKs

2

Go, Rust, Python

operator lanes

2

CLI and MCP

@cosantoir/node@cosantoir/next@cosantoir/express@cosantoir/honogithub.com/cosantoir/cosantoir-gocargo add cosantoirpip install cosantoircosantoir logincosantoir-mcp@cosantoir/node@cosantoir/next@cosantoir/express@cosantoir/honogithub.com/cosantoir/cosantoir-gocargo add cosantoirpip install cosantoircosantoir logincosantoir-mcp

Top-level inventory

Package inventory

Every package exists because it owns a different slice of runtime logic. Treating them as interchangeable is how docs and code drift apart.

JavaScript wrapper family

Adapter family

The wrapper family splits into app-level and server-level ownership. That distinction matters more than language aesthetics.

Core constructor

Direct JavaScript client

ts
01import { createCosantoir } from "@cosantoir/node";
02 
03const client = createCosantoir({
04 baseUrl: process.env.COSANTOIR_GATEWAY_URL!,
05 apiKey: process.env.COSANTOIR_API_KEY!,
06 siteId: process.env.COSANTOIR_SITE_ID!,
07});

Native clients

Language constructor map

multi
01Go cosantoir.NewClient(cosantoir.Options{ BaseURL, APIKey, SiteID })
02Rust Cosantoir::new(CosantoirOptions { base_url, api_key, site_id, timeout_ms })
03Python Cosantoir(CosantoirOptions(base_url=..., api_key=..., site_id=...))

Native SDKs

Language clients

Go, Rust, and Python already exist as first-class repo surfaces. They should be documented as deliberate integration lanes, not afterthoughts.

Surface choice

Selection rules

Choosing the wrong surface is how the code and docs both become vague. Pick by lifecycle ownership.

Use a wrapper when the framework owns request state.

If middleware, route handlers, hooks, or loaders are the real boundary, the wrapper should be the first-class surface.

Use `@cosantoir/node` when you own transport and response shape.

Direct evaluator calls are cleaner when your code decides method, path normalization, timing, or fan-out behavior.

Use language SDKs outside the JavaScript ecosystem.

Go, Rust, and Python are not fallback lanes; they are the right surface for services that already live there.

Use CLI and MCP for operator and agent work only.

They should not replace request middleware. They exist to observe, bootstrap, and expose bounded evaluator access.

Coverage map

Coverage map

Use the coverage count to judge breadth, but use the surface map to judge where each package belongs.

App wrappers

7

Server wrappers

9

Language clients

4

Operator surfaces

2

Last updated Mar 24, 2026