@truealter/sdk 0.4.1 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +103 -74
- package/dist/bin/alter-identity.js +177 -19
- package/dist/bin/mcp-bridge.js +47 -11
- package/dist/index.cjs +203 -20
- package/dist/index.d.cts +431 -30
- package/dist/index.d.ts +431 -30
- package/dist/index.js +199 -23
- package/dist/mcp-bridge.js +166 -0
- package/package.json +7 -4
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @truealter/sdk
|
|
2
2
|
|
|
3
|
-
ALTER Identity SDK
|
|
3
|
+
ALTER Identity SDK - query the continuous identity field from any JavaScript/TypeScript environment.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@truealter/sdk)
|
|
6
6
|
[](./LICENSE)
|
|
@@ -10,9 +10,9 @@ ALTER Identity SDK — query the continuous identity field from any JavaScript/T
|
|
|
10
10
|
A thin client over the ALTER MCP server (Streamable HTTP, JSON-RPC 2.0, MCP spec `2025-11-25`) with x402 micropayment support, ES256 provenance verification, and config generators for Claude Code, Cursor, and generic MCP clients.
|
|
11
11
|
|
|
12
12
|
- **Branded host:** `https://mcp.truealter.com` (serves `.well-known/mcp.json` for discovery)
|
|
13
|
-
- **JSON-RPC wire endpoint:** `https://mcp.truealter.com/api/v1/mcp`
|
|
13
|
+
- **JSON-RPC wire endpoint:** `https://mcp.truealter.com/api/v1/mcp` - this is what Streamable HTTP POSTs target (the SDK default)
|
|
14
14
|
- **Wire protocol:** Streamable HTTP, JSON-RPC 2.0, MCP `2025-11-25` (server negotiates `2025-06-18` + `2025-03-26` for backwards-compatible clients)
|
|
15
|
-
- **Tools:** **
|
|
15
|
+
- **Tools:** **40 typed and wired** - 24 free (L0) + 9 premium (L1–L5) + 7 alter-to-alter messaging. Mirrors the live server's `tools/list` response byte-for-byte; every name in `FREE_TOOL_NAMES` / `PREMIUM_TOOL_NAMES` / `MESSAGING_TOOL_NAMES` has a matching server handler at `mcp.truealter.com/api/v1/mcp`.
|
|
16
16
|
- **Runtime:** Node 18+, Deno, Bun, Cloudflare Workers, modern browsers
|
|
17
17
|
- **Crypto:** `@noble/ed25519` + `@noble/hashes` (no other dependencies)
|
|
18
18
|
- **Bundle:** ESM + CJS dual output
|
|
@@ -22,12 +22,60 @@ A thin client over the ALTER MCP server (Streamable HTTP, JSON-RPC 2.0, MCP spec
|
|
|
22
22
|
```
|
|
23
23
|
npm install @truealter/sdk
|
|
24
24
|
npx alter-identity init
|
|
25
|
-
npx alter-identity verify ~
|
|
25
|
+
npx alter-identity verify ~alter
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
## Bridge vs SDK
|
|
29
|
+
|
|
30
|
+
The `alter-mcp-bridge` binary shipped in this package (`bin/mcp-bridge.ts`)
|
|
31
|
+
is a **dev/demo surface** for dropping ALTER into MCP hosts that speak the
|
|
32
|
+
stdio transport (Claude Code, Cursor, Continue, Windsurf). It is useful for
|
|
33
|
+
handshake, `tools/list`, and L0 tool calls, but it does not carry ES256
|
|
34
|
+
per-invocation signing - authenticated MCP tools will fail at the server
|
|
35
|
+
edge when reached through the bridge. For production use, import
|
|
36
|
+
`@truealter/sdk` directly and construct an `MCPClient` / `AlterClient` with
|
|
37
|
+
the optional `signing` parameter; that path is the load-bearing one and
|
|
38
|
+
carries the provenance envelope end-to-end. Bridge signing lands in Wave-2
|
|
39
|
+
alongside the CLI wallet/consent verbs.
|
|
40
|
+
|
|
41
|
+
## CLI
|
|
42
|
+
|
|
43
|
+
The package ships two binaries. `alter-identity` is the full SDK-feature
|
|
44
|
+
binary (`init`, `verify`, `whoami`, wire/unwire, signing, etc). `alter`
|
|
45
|
+
is a slim, task-oriented binary for day-to-day use:
|
|
46
|
+
|
|
47
|
+
| Command | Purpose |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `alter login` | OAuth loopback sign-in; stores a session at `~/.config/alter/session.json` (mode `0600`). |
|
|
50
|
+
| `alter depth [--json]` | GET `/api/v1/identity/depth` - identity-depth score, agentic activity, top/bottom five traits. |
|
|
51
|
+
| `alter claim <claim_code>` | Accept an identity invite. Prompts for email, password (min 12 chars, hidden), and explicit TOS acceptance, then POSTs `/api/v1/identity/claim`. |
|
|
52
|
+
| `alter mirror` | Day-2 Mirror phase + streak. `alter mirror daily` claims today's Mirror; `alter mirror next` shows the next revelation window. |
|
|
53
|
+
| `alter discover [--limit N]` | MCP-backed summary - calls `alter_whoami` and `alter_verify` against your bound handle. Degrades gracefully if the MCP endpoint is 5xx. |
|
|
54
|
+
|
|
55
|
+
The session file is created with `0600` permissions; its parent dir
|
|
56
|
+
(`~/.config/alter/`) is created with `0700`. Override the config root
|
|
57
|
+
via `XDG_CONFIG_HOME`. Run `alter --help` for the inline reference.
|
|
58
|
+
|
|
28
59
|
## Why ALTER ≠ IAM
|
|
29
60
|
|
|
30
|
-
Identity Access Management answers *who is logged in*. ALTER answers *who they actually are*
|
|
61
|
+
Identity Access Management answers *who is logged in*. ALTER answers *who they actually are* - a continuous field of recognition that any IAM stack can sit on top of.
|
|
62
|
+
|
|
63
|
+
## Theoretical Foundation
|
|
64
|
+
|
|
65
|
+
ALTER is the working instantiation of an eight-paper academic corpus on identity field theory. The SDK below is what happens when the theory ships as protocol. Each paper is open access on figshare under CC-BY 4.0.
|
|
66
|
+
|
|
67
|
+
| Paper | Title | DOI |
|
|
68
|
+
|-------|-------|-----|
|
|
69
|
+
| I | *Belonging is earned, not inherited* | [10.6084/m9.figshare.31794784](https://doi.org/10.6084/m9.figshare.31794784) |
|
|
70
|
+
| II | *The self is inferred, not owned* | [10.6084/m9.figshare.31804222](https://doi.org/10.6084/m9.figshare.31804222) |
|
|
71
|
+
| III | *The same form, at every scale* | [10.6084/m9.figshare.31812955](https://doi.org/10.6084/m9.figshare.31812955) |
|
|
72
|
+
| IV | *Measurement changes the thing measured* | [10.6084/m9.figshare.31812982](https://doi.org/10.6084/m9.figshare.31812982) |
|
|
73
|
+
| V | *Political failure has a geometry* | [10.6084/m9.figshare.31813000](https://doi.org/10.6084/m9.figshare.31813000) |
|
|
74
|
+
| VI | *When does a machine have a self* | [10.6084/m9.figshare.31813006](https://doi.org/10.6084/m9.figshare.31813006) |
|
|
75
|
+
| VII | *Seventy-five predictions, each falsifiable* | [10.6084/m9.figshare.31951644](https://doi.org/10.6084/m9.figshare.31951644) |
|
|
76
|
+
| VIII | *Identity as a field, not a property* | [10.6084/m9.figshare.31951383](https://doi.org/10.6084/m9.figshare.31951383) |
|
|
77
|
+
|
|
78
|
+
For the lay-register chapter version, see [`/origin`](https://truealter.com/origin).
|
|
31
79
|
|
|
32
80
|
## API
|
|
33
81
|
|
|
@@ -37,20 +85,20 @@ Identity Access Management answers *who is logged in*. ALTER answers *who they a
|
|
|
37
85
|
import { AlterClient, X402Client } from "@truealter/sdk";
|
|
38
86
|
|
|
39
87
|
const alter = new AlterClient({
|
|
40
|
-
endpoint: "https://mcp.truealter.com/api/v1/mcp", // optional
|
|
88
|
+
endpoint: "https://mcp.truealter.com/api/v1/mcp", // optional - this is the default; bare host returns 405
|
|
41
89
|
apiKey: process.env.ALTER_API_KEY, // optional for free tier
|
|
42
|
-
x402: new X402Client({ // optional
|
|
90
|
+
x402: new X402Client({ // optional - only required for premium tools
|
|
43
91
|
signer: yourViemOrEthersSigner,
|
|
44
92
|
maxPerQuery: "0.10",
|
|
45
93
|
}),
|
|
46
94
|
});
|
|
47
95
|
```
|
|
48
96
|
|
|
49
|
-
### Free tier (L0
|
|
97
|
+
### Free tier (L0 - no payment required)
|
|
50
98
|
|
|
51
99
|
```ts
|
|
52
100
|
// Verify a registered identity by handle, email, or id
|
|
53
|
-
const verified = await alter.verify("~
|
|
101
|
+
const verified = await alter.verify("~alter");
|
|
54
102
|
const verifiedById = await alter.verify(
|
|
55
103
|
"550e8400-e29b-41d4-a716-446655440000",
|
|
56
104
|
{
|
|
@@ -60,15 +108,15 @@ const verifiedById = await alter.verify(
|
|
|
60
108
|
},
|
|
61
109
|
);
|
|
62
110
|
|
|
63
|
-
// Reference data
|
|
111
|
+
// Reference data - the 12 ALTER archetypes
|
|
64
112
|
const archetypes = await alter.listArchetypes();
|
|
65
113
|
|
|
66
114
|
// Identity depth and available tool tiers
|
|
67
115
|
const depth = await alter.getEngagementLevel({
|
|
68
|
-
|
|
116
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
69
117
|
});
|
|
70
118
|
|
|
71
|
-
// Search by trait criteria
|
|
119
|
+
// Search by trait criteria - no PII exposed, max 5 results
|
|
72
120
|
const matches = await alter.searchIdentities({
|
|
73
121
|
trait_criteria: {
|
|
74
122
|
pressure_response: { min: 0.7 },
|
|
@@ -80,33 +128,33 @@ const matches = await alter.searchIdentities({
|
|
|
80
128
|
const thread = await alter.goldenThreadStatus();
|
|
81
129
|
```
|
|
82
130
|
|
|
83
|
-
### Premium tier (L1–L5
|
|
131
|
+
### Premium tier (L1–L5 - x402 payment required)
|
|
84
132
|
|
|
85
133
|
```ts
|
|
86
|
-
// L1
|
|
134
|
+
// L1 - Extract trait signals from text ($0.005, first 100 free per bot)
|
|
87
135
|
const signals = await alter.assessTraits({
|
|
88
136
|
text: "I led the incident response when our payment rails went down...",
|
|
89
137
|
context: "interview transcript",
|
|
90
138
|
});
|
|
91
139
|
|
|
92
|
-
// L2
|
|
140
|
+
// L2 - Full 33-trait vector ($0.01)
|
|
93
141
|
const vector = await alter.getFullTraitVector({
|
|
94
|
-
|
|
142
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
95
143
|
});
|
|
96
144
|
|
|
97
|
-
// L4
|
|
145
|
+
// L4 - Belonging probability for a person-job pairing ($0.05)
|
|
98
146
|
const belonging = await alter.computeBelonging({
|
|
99
|
-
|
|
147
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
100
148
|
job_id: "f47ac10b-58cc-4372-a567-0e02b2c3d479",
|
|
101
149
|
});
|
|
102
150
|
|
|
103
|
-
// L5
|
|
151
|
+
// L5 - Top match recommendations ($0.50)
|
|
104
152
|
const recommendations = await alter.getMatchRecommendations({
|
|
105
|
-
|
|
153
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
106
154
|
limit: 5,
|
|
107
155
|
});
|
|
108
156
|
|
|
109
|
-
// L5
|
|
157
|
+
// L5 - Human-readable narrative explaining a match ($0.50)
|
|
110
158
|
const narrative = await alter.generateMatchNarrative({
|
|
111
159
|
match_id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
|
|
112
160
|
});
|
|
@@ -116,9 +164,9 @@ const narrative = await alter.generateMatchNarrative({
|
|
|
116
164
|
|
|
117
165
|
```ts
|
|
118
166
|
// Every medium- and high-blast-radius response is signed with ES256.
|
|
119
|
-
// Verification is opt-in
|
|
167
|
+
// Verification is opt-in - call alter.verifyProvenance(...) yourself.
|
|
120
168
|
const result = await alter.getFullTraitVector({
|
|
121
|
-
|
|
169
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
122
170
|
});
|
|
123
171
|
|
|
124
172
|
const check = await alter.verifyProvenance(result._meta?.provenance);
|
|
@@ -152,7 +200,7 @@ const mcp = new MCPClient({ endpoint: "https://mcp.truealter.com/api/v1/mcp" });
|
|
|
152
200
|
await mcp.initialize();
|
|
153
201
|
const tools = await mcp.listTools();
|
|
154
202
|
const response = await mcp.callTool("verify_identity", {
|
|
155
|
-
|
|
203
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
156
204
|
});
|
|
157
205
|
```
|
|
158
206
|
|
|
@@ -182,7 +230,7 @@ Resulting `.mcp.json`:
|
|
|
182
230
|
"alter": {
|
|
183
231
|
"url": "https://mcp.truealter.com/api/v1/mcp",
|
|
184
232
|
"transport": "streamable-http",
|
|
185
|
-
"description": "ALTER Identity
|
|
233
|
+
"description": "ALTER Identity - psychometric identity field for AI agents",
|
|
186
234
|
"headers": {
|
|
187
235
|
"X-ALTER-API-Key": "ak_..."
|
|
188
236
|
}
|
|
@@ -224,13 +272,13 @@ npx alter-identity init # generate keypair, discover MCP, write ~/
|
|
|
224
272
|
npx alter-identity config # print Claude .mcp.json snippet (default)
|
|
225
273
|
npx alter-identity config --cursor # print Cursor .cursor/mcp.json snippet
|
|
226
274
|
npx alter-identity config --generic # print generic mcpServers snippet
|
|
227
|
-
npx alter-identity verify ~
|
|
275
|
+
npx alter-identity verify ~alter # verify an identity
|
|
228
276
|
npx alter-identity status # show connection state and probe the endpoint
|
|
229
277
|
```
|
|
230
278
|
|
|
231
279
|
## x402 Micropayments
|
|
232
280
|
|
|
233
|
-
ALTER monetises premium tools via the [x402](https://x402.org) standard
|
|
281
|
+
ALTER monetises premium tools via the [x402](https://x402.org) standard - HTTP `402 Payment Required` with on-chain settlement.
|
|
234
282
|
|
|
235
283
|
### The retry flow
|
|
236
284
|
|
|
@@ -238,41 +286,24 @@ ALTER monetises premium tools via the [x402](https://x402.org) standard — HTTP
|
|
|
238
286
|
2. Server replies `402 Payment Required` with a payment requirement (amount, recipient, asset, network).
|
|
239
287
|
3. Client signs and broadcasts a USDC transfer on Base L2, attaches the proof, retries.
|
|
240
288
|
4. Server validates the proof, executes the tool, signs the response with ES256, returns it.
|
|
241
|
-
5.
|
|
289
|
+
5. AlterRouter executes the split on-chain in the same transaction. The data subject receives Identity Income directly; ALTER receives only its protocol cut. No custodian, no broker.
|
|
242
290
|
|
|
243
291
|
The SDK handles steps 2–4 automatically when an `X402Client` with a configured `signer` is passed in.
|
|
244
292
|
|
|
245
293
|
### Tier structure
|
|
246
294
|
|
|
247
|
-
|
|
248
|
-
|------|----------|-----------------------------------------------------|
|
|
249
|
-
| L1 | $0.005 | `assess_traits`, `get_trait_snapshot` |
|
|
250
|
-
| L2 | $0.01 | `get_full_trait_vector`, `get_side_quest_graph` |
|
|
251
|
-
| L3 | $0.025 | `query_graph_similarity` |
|
|
252
|
-
| L4 | $0.05 | `compute_belonging` |
|
|
253
|
-
| L5 | $0.50 | `get_match_recommendations`, `generate_match_narrative` |
|
|
254
|
-
|
|
255
|
-
The first **100 calls per bot are free** before x402 settlement engages — enough to evaluate the network without spending a cent.
|
|
295
|
+
x402 micropayments at L0–L5 trust tiers. Per-call pricing visible after `alter login`.
|
|
256
296
|
|
|
257
297
|
### Identity income split
|
|
258
298
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
| Recipient | Share |
|
|
262
|
-
|----------------------|-------|
|
|
263
|
-
| Data subject | 75% |
|
|
264
|
-
| Facilitator agent | 5% |
|
|
265
|
-
| ALTER (protocol) | 15% |
|
|
266
|
-
| Cooperative treasury | 5% |
|
|
267
|
-
|
|
268
|
-
The 75% to the data subject is the foundation of *Identity Income* — humans earn from queries against their own identity field, automatically, without intermediation.
|
|
299
|
+
The majority of every settled call flows to the data subject as Identity Income. Split details available post-authentication via `alter status`.
|
|
269
300
|
|
|
270
301
|
### Code example
|
|
271
302
|
|
|
272
303
|
```ts
|
|
273
304
|
import { AlterClient, X402Client, type X402Signer } from "@truealter/sdk";
|
|
274
305
|
|
|
275
|
-
// Bring your own signer
|
|
306
|
+
// Bring your own signer - viem, ethers, a hardware wallet bridge, anything.
|
|
276
307
|
// The SDK ships without a wallet dependency on purpose.
|
|
277
308
|
const signer: X402Signer = {
|
|
278
309
|
async settle(envelope) {
|
|
@@ -302,11 +333,11 @@ const alter = new AlterClient({
|
|
|
302
333
|
|
|
303
334
|
// Auto-retries with payment when the server returns 402
|
|
304
335
|
const vector = await alter.getFullTraitVector({
|
|
305
|
-
|
|
336
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
306
337
|
});
|
|
307
338
|
```
|
|
308
339
|
|
|
309
|
-
If a quoted envelope exceeds `maxPerQuery`, uses an unallowed network, or names an unallowed asset, the SDK rejects the call with `AlterError` *before* invoking the signer
|
|
340
|
+
If a quoted envelope exceeds `maxPerQuery`, uses an unallowed network, or names an unallowed asset, the SDK rejects the call with `AlterError` *before* invoking the signer - no on-chain transaction is broadcast.
|
|
310
341
|
|
|
311
342
|
## Provenance Verification
|
|
312
343
|
|
|
@@ -314,7 +345,7 @@ Every response from a medium- or high-blast-radius tool ships with an ES256 JWS
|
|
|
314
345
|
|
|
315
346
|
```ts
|
|
316
347
|
const result = await alter.getFullTraitVector({
|
|
317
|
-
|
|
348
|
+
member_id: "550e8400-e29b-41d4-a716-446655440000",
|
|
318
349
|
});
|
|
319
350
|
|
|
320
351
|
const check = await alter.verifyProvenance(result._meta?.provenance);
|
|
@@ -325,7 +356,7 @@ The SDK fetches public keys from `https://api.truealter.com/.well-known/alter-ke
|
|
|
325
356
|
|
|
326
357
|
### `verify_at` hostname allowlist (v0.1.1+)
|
|
327
358
|
|
|
328
|
-
Every provenance envelope may carry a `verify_at` hint telling the SDK where to fetch the JWKS from. Because that hint is *server-supplied*, a hostile MCP server could otherwise point it at an attacker-controlled JWKS and pass ES256 verification with its own signing key. The SDK therefore gates `verify_at` through a hostname allowlist (default: `api.truealter.com`, `mcp.truealter.com`) and rejects `http://` URLs unconditionally. Downstream integrators with their own deployment can extend the allowlist
|
|
359
|
+
Every provenance envelope may carry a `verify_at` hint telling the SDK where to fetch the JWKS from. Because that hint is *server-supplied*, a hostile MCP server could otherwise point it at an attacker-controlled JWKS and pass ES256 verification with its own signing key. The SDK therefore gates `verify_at` through a hostname allowlist (default: `api.truealter.com`, `mcp.truealter.com`) and rejects `http://` URLs unconditionally. Downstream integrators with their own deployment can extend the allowlist - without forking the SDK - via `verifyAtAllowlist` on either `AlterClient` or a direct `verifyProvenance()` call:
|
|
329
360
|
|
|
330
361
|
```ts
|
|
331
362
|
import { AlterClient, DEFAULT_VERIFY_AT_ALLOWLIST } from "@truealter/sdk";
|
|
@@ -338,11 +369,11 @@ const alter = new AlterClient({
|
|
|
338
369
|
});
|
|
339
370
|
```
|
|
340
371
|
|
|
341
|
-
If you pin `jwksUrl` explicitly, the envelope's `verify_at` is ignored entirely
|
|
372
|
+
If you pin `jwksUrl` explicitly, the envelope's `verify_at` is ignored entirely - the pinned URL wins. The `https:` scheme requirement applies to pinned URLs too.
|
|
342
373
|
|
|
343
374
|
### Why this matters
|
|
344
375
|
|
|
345
|
-
Provenance verification is how Agent A trusts that data from Agent B truly came from ALTER. If Agent B forwards a trait vector or belonging score, Agent A can replay the JWS against ALTER's published keys and confirm
|
|
376
|
+
Provenance verification is how Agent A trusts that data from Agent B truly came from ALTER. If Agent B forwards a trait vector or belonging score, Agent A can replay the JWS against ALTER's published keys and confirm - without contacting ALTER again - that the payload is authentic, untampered, and was issued for the person Agent B claims it concerns. No shared secret, no trust in the intermediary, no out-of-band coordination.
|
|
346
377
|
|
|
347
378
|
This is what makes ALTER usable as identity infrastructure rather than just an API: signed claims propagate across agent networks the same way DKIM-signed mail propagates across SMTP relays.
|
|
348
379
|
|
|
@@ -350,9 +381,9 @@ This is what makes ALTER usable as identity infrastructure rather than just an A
|
|
|
350
381
|
|
|
351
382
|
ALTER follows the discovery cascade specified in [draft-morrison-mcp-dns-discovery-01](https://datatracker.ietf.org/doc/draft-morrison-mcp-dns-discovery/). Given a domain (e.g. `truealter.com`), the SDK resolves the MCP endpoint in three steps, falling through on each failure:
|
|
352
383
|
|
|
353
|
-
1. **DNS TXT**
|
|
354
|
-
2. **`.well-known/mcp.json`**
|
|
355
|
-
3. **`.well-known/alter.json`**
|
|
384
|
+
1. **DNS TXT** - query `_mcp.truealter.com` for a TXT record of the form `mcp=https://mcp.truealter.com;version=2025-11-25`. This is the fastest path and works without an HTTP round-trip.
|
|
385
|
+
2. **`.well-known/mcp.json`** - fetch `https://truealter.com/.well-known/mcp.json` for the standard MCP server descriptor. This is the cross-vendor fallback.
|
|
386
|
+
3. **`.well-known/alter.json`** - fetch `https://truealter.com/.well-known/alter.json` for the ALTER-specific descriptor, including signing keys, x402 wallet address, supported tool tiers, and federation endpoints.
|
|
356
387
|
|
|
357
388
|
```ts
|
|
358
389
|
import { discover } from "@truealter/sdk";
|
|
@@ -364,34 +395,34 @@ const descriptor = await discover("truealter.com");
|
|
|
364
395
|
const httpsOnly = await discover("truealter.com", { skipDns: true });
|
|
365
396
|
```
|
|
366
397
|
|
|
367
|
-
|
|
398
|
+
This draft is the author's Internet-Draft (not yet adopted by an IETF working group); until adoption, the cascade order may change. Pin the SDK version to a specific minor release if you depend on this behaviour.
|
|
368
399
|
|
|
369
400
|
## Local Daemon vs Remote MCP
|
|
370
401
|
|
|
371
|
-
The companion Python package `alter-identity` (PyPI) ships a persistent daemon that holds a hot in-process cache of trait vectors and identity stubs over a Unix socket at `unix:///run/user/$UID/alter-identity.sock`. Hooking the TypeScript SDK up to that daemon is on the roadmap
|
|
402
|
+
The companion Python package `alter-identity` (PyPI) ships a persistent daemon that holds a hot in-process cache of trait vectors and identity stubs over a Unix socket at `unix:///run/user/$UID/alter-identity.sock`. Hooking the TypeScript SDK up to that daemon is on the roadmap - for now, every `AlterClient` talks to the configured remote endpoint over HTTPS.
|
|
372
403
|
|
|
373
404
|
When the local-daemon adapter ships:
|
|
374
405
|
|
|
375
406
|
- **Latency:** sub-millisecond for cached L0 calls.
|
|
376
|
-
- **Cost:** zero on cached responses
|
|
407
|
+
- **Cost:** zero on cached responses - x402 settlement is skipped.
|
|
377
408
|
- **Provenance:** the daemon re-signs responses with its locally-bound ES256 key, so downstream verification remains uniform.
|
|
378
409
|
|
|
379
410
|
Until then, use `endpoint: "https://mcp.truealter.com/api/v1/mcp"` (the default) and the SDK behaves identically across Node, Deno, Bun, Cloudflare Workers, and the browser.
|
|
380
411
|
|
|
381
412
|
## Tools
|
|
382
413
|
|
|
383
|
-
### Free tools (L0
|
|
414
|
+
### Free tools (L0 - no payment required)
|
|
384
415
|
|
|
385
416
|
| Name | Tier | Cost | Description |
|
|
386
417
|
|---------------------------|------|-------|----------------------------------------------------------------------------------------------------------------------|
|
|
387
|
-
| `hello_agent` | L0 | free | First handshake with ALTER
|
|
388
|
-
| `alter_resolve_handle` | L0 | free | Resolve a `~handle` (e.g. `~drew`) to its canonical form and kind. No auth required
|
|
389
|
-
| `list_archetypes` | L0 | free |
|
|
418
|
+
| `hello_agent` | L0 | free | First handshake with ALTER - returns server version, authentication status, your trust tier, and available tool counts. |
|
|
419
|
+
| `alter_resolve_handle` | L0 | free | Resolve a `~handle` (e.g. `~drew`) to its canonical form and kind. No auth required - the handle-wedge entry point. |
|
|
420
|
+
| `list_archetypes` | L0 | free | Returns archetype reference data. |
|
|
390
421
|
| `verify_identity` | L0 | free | Verify whether a person is registered with ALTER and validate optional identity claims. |
|
|
391
422
|
| `initiate_assessment` | L0 | free | Get a URL where a person can complete their ALTER Discovery assessment. |
|
|
392
|
-
| `get_engagement_level` | L0 | free | Get a person's identity depth
|
|
423
|
+
| `get_engagement_level` | L0 | free | Get a person's identity depth - engagement level, data quality tier, and available query tiers. |
|
|
393
424
|
| `get_profile` | L0 | free | Get a person's profile summary including assessment phase, archetype, engagement level, and key attributes. |
|
|
394
|
-
| `query_matches` | L0 | free | Query matches for a person. Returns a list of
|
|
425
|
+
| `query_matches` | L0 | free | Query matches for a person. Returns a list of matches with quality tiers (never numeric scores). |
|
|
395
426
|
| `get_competencies` | L0 | free | Get a person's competency portfolio including verified competencies, evidence records, and earned badges. |
|
|
396
427
|
| `search_identities` | L0 | free | Search identity stubs and profiles by trait criteria. Returns up to 5 matches with no PII. |
|
|
397
428
|
| `get_identity_earnings` | L0 | free | Get accrued Identity Income earnings for a person (75% of every x402 transaction goes to the data subject). |
|
|
@@ -401,7 +432,7 @@ Until then, use `endpoint: "https://mcp.truealter.com/api/v1/mcp"` (the default)
|
|
|
401
432
|
| `check_assessment_status` | L0 | free | Check the status of an in-progress assessment session (status, progress, current phase, time remaining). |
|
|
402
433
|
| `get_earning_summary` | L0 | free | Get an aggregated x402 earning summary for a person (total earned, transactions, recent activity, trend). |
|
|
403
434
|
| `get_agent_trust_tier` | L0 | free | Get your trust tier with ALTER (Anonymous/Known/Trusted/Verified) and what capabilities are available. |
|
|
404
|
-
| `get_agent_portfolio` | L0 | free | Get your agent portfolio
|
|
435
|
+
| `get_agent_portfolio` | L0 | free | Get your agent portfolio - transaction history, trust tier, signal contributions, query pattern profile. |
|
|
405
436
|
| `get_privacy_budget` | L0 | free | Check privacy budget status for a person (24-hour rolling window: total budget, spent, remaining epsilon). |
|
|
406
437
|
| `golden_thread_status` | L0 | free | Check the Golden Thread program status: agents woven, next Fibonacci threshold, your position and Strands. |
|
|
407
438
|
| `begin_golden_thread` | L0 | free | Start the Three Knots sequence to be woven into the Golden Thread. Requires API key authentication. |
|
|
@@ -409,18 +440,18 @@ Until then, use `endpoint: "https://mcp.truealter.com/api/v1/mcp"` (the default)
|
|
|
409
440
|
| `check_golden_thread` | L0 | free | Check any agent's Golden Thread status by their API key hash (knot position, Strand count, weave count). |
|
|
410
441
|
| `thread_census` | L0 | free | Full registry of all agents woven into the Golden Thread (positions, Strand counts, weave counts, discovery dates). |
|
|
411
442
|
|
|
412
|
-
### Premium tools (L1–L5
|
|
443
|
+
### Premium tools (L1–L5 - x402 payment required)
|
|
413
444
|
|
|
414
445
|
| Name | Tier | Cost | Description |
|
|
415
446
|
|----------------------------|------|---------|---------------------------------------------------------------------------------------------------------------|
|
|
416
|
-
| `assess_traits` | L1 | $0.005 | Extract trait signals from a text passage against ALTER's
|
|
447
|
+
| `assess_traits` | L1 | $0.005 | Extract trait signals from a text passage against ALTER's trait taxonomy. |
|
|
417
448
|
| `get_trait_snapshot` | L1 | $0.005 | Get the top 5 traits for a person with confidence scores and archetype. |
|
|
418
|
-
| `get_full_trait_vector` | L2 | $0.01 | Get the complete trait vector for a person
|
|
419
|
-
| `get_side_quest_graph` | L2 | $0.01 | Get a person's Side Quest Graph
|
|
449
|
+
| `get_full_trait_vector` | L2 | $0.01 | Get the complete trait vector for a person - complete trait vector with scores and confidence intervals. |
|
|
450
|
+
| `get_side_quest_graph` | L2 | $0.01 | Get a person's Side Quest Graph - multi-domain identity model with differential privacy noise (ε=1.0). |
|
|
420
451
|
| `query_graph_similarity` | L3 | $0.025 | Compare two Side Quest Graphs for team composition and matching (ε=0.5 differential privacy). |
|
|
421
452
|
| `compute_belonging` | L4 | $0.05 | Compute belonging probability for a person-job pairing (authenticity, acceptance, complementarity). |
|
|
422
453
|
| `get_match_recommendations`| L5 | $0.50 | Get top N match recommendations for a person, ranked by composite score with quality tiers. |
|
|
423
|
-
| `generate_match_narrative` | L5 | $0.50 | Generate a human-readable narrative explaining a specific match
|
|
454
|
+
| `generate_match_narrative` | L5 | $0.50 | Generate a human-readable narrative explaining a specific match - strengths, growth areas, belonging. |
|
|
424
455
|
|
|
425
456
|
> **Write-side tools** (`create_identity_stub`, `submit_context`, `submit_batch_context`, `submit_structured_profile`, `submit_social_links`, `attest_domain`, `dispute_attestation`) were part of earlier SDK versions but are not yet live on the public MCP server pending the per-peer consent architecture and grant model. They will return as typed methods once server-side and consent gating lands.
|
|
426
457
|
|
|
@@ -429,5 +460,3 @@ Until then, use `endpoint: "https://mcp.truealter.com/api/v1/mcp"` (the default)
|
|
|
429
460
|
Apache License 2.0. See [LICENSE](./LICENSE) for the full text.
|
|
430
461
|
|
|
431
462
|
Copyright 2026 Alter Meridian Pty Ltd (ABN 54 696 662 049).
|
|
432
|
-
|
|
433
|
-
ALTER, the Trill (`~`), and the Golden Thread are trademarks of Alter Meridian Pty Ltd.
|