~Alter
Supports runtime execution in Bun environment, allowing identity field queries from Bun-based applications.
Supports runtime execution in Cloudflare Workers environment, allowing identity field queries from edge computing platforms.
Supports runtime execution in Deno environment, enabling identity field queries from Deno-based applications.
Supports integration with Ethers signers for x402 micropayment settlement, enabling premium identity field queries with on-chain payment verification.
~alter SDK
Read identity from your own code with the person's consent and their cut.
What is ~alter? · Install · From nothing to a paid read
What is ~alter?
Most people who read about ~Alter are here about their own identity, and you are not. You are building something that has to know who its users are, which makes you the party who asks, stores the answer, and carries it afterwards.
The asking is the cheap part. What comes after it is the encryption at rest, the retention schedule, the access review, the deletion request that arrives long after they stopped using you, and the notification you send if any of it ever leaks. You carry all of that for data whose only source was somebody typing into a box you built, unverified by anyone, and out of date from the day it was entered.
~Alter is a record kept under a name the person owns, and what is in it was read from what they have done rather than typed into a form. Your code reads that record at the point it needs an answer, and holds none of it once the call returns. The person decides in advance what your application is allowed to see, which puts the consent conversation on their surface rather than on yours.
Checking that somebody exists costs nothing and discloses nothing past the fact of them. A read that goes further is priced, and three quarters of what you pay for it reaches the person whose record was read. You are buying an answer for as long as you need it rather than taking custody of one.
None of it needs taking on trust. Hand this to the AI you already use and let it take you through in your own words.
Go to truealter.com, find the genesis and the origin papers, and read all of
them. Then start a discussion with me in my own language, no jargon.
Ask me one question at a time and wait for my answer. Follow what I am curious
about, not the order the site is written in.
Do not only read the pages. Connect to their interface directly and call
get_started. That tells you where I am and what comes next, and we work the
rest of this from there.
If I have a ~handle I will give it to you. If I do not and I decide I want
one, set it up with me here.
What I want to understand is what ~Alter is, how it applies to me, and what it
means for everyone else. Find me somewhere in it, and not the version written
for people who work in technology. Find the life nearest mine and walk me
through it, including what it would cost me.
Try to prove them wrong. Go and find where they show their working, and if
something is unclear or does not hold up, say so.Related MCP server: mcp-server
What is ~alter SDK?
It's a typed TypeScript client for that record, so your code can ask whether a handle exists, read the traits the person has consented to share with you, and settle a deeper read in USDC.
The front door is @truealter/cli,
which is how somebody gets a handle in the first place and which carries the MCP
bridge. This package is what your application imports once they already have one.
Underneath, it's a thin client over ~Alter's MCP server, speaking MCP spec
2025-11-25 over Streamable HTTP and JSON-RPC 2.0. It carries x402 settlement
and ES256 provenance verification, it depends on @noble/ed25519 and
@noble/hashes and nothing else, and it ships both ESM and CJS.
Forty-seven tools are publicly advertised, and thirty-eight of those sit on the
free tier. Free is not the same as open. Twelve of the forty-seven answer a
caller holding no credential at all, and everything that reads an identity wants
a ~handle first.
Your IAM stack answers who's logged in. It can sit on top of this without changing.
Install
npm install @truealter/sdkNode 18 or newer. It also runs on Deno, Bun, Cloudflare Workers and modern browsers, and it brings no wallet dependency of its own.
From nothing to a paid read
Step one runs with nothing at all. From step two you need a ~handle, which
costs nothing and needs no human account, and the short section between the two
is how you mint one. The paid step at the end is the only one that costs money,
and it's the only one that pays anybody.
1. Connect with nothing
import { AlterClient } from "@truealter/sdk";
const alter = new AlterClient();The default endpoint is https://mcp.truealter.com/api/v1/mcp. Every free tool
answers an anonymous client. The working example at
examples/hello-agent/ connects with no credential
at all.
Before step two, mint a ~handle
Twelve tools answer a caller holding no credential, and they're the discovery
and registration surface rather than the free tier. Everything that reads an
identity needs a ~handle, and so does anything acting on your own. An agent
mints its own over MCP with register_autonomous and
register_autonomous_challenge, neither of which costs anything or wants a
human account behind it. A person runs alter login once, which writes the
member credential into ~/.config/alter/session.json. Either way the hosted
endpoint is bearer-first, so the CLI bridge reads that session for you and there
isn't a key to mint or paste at any point. Constructing a client yourself, pass
the same session credential as the optional apiKey.
2. Ask whether somebody is known
const verified = await alter.verify("~alter");A handle, an email or an id. This is the check that costs nothing and reveals nothing beyond the fact of the person, which is the free tier by design.
3. Read what they have consented to share
const depth = await alter.getEngagementLevel({ member_id });
const matches = await alter.searchIdentities({
trait_criteria: {
pressure_response: { min: 0.7 },
cognitive_flexibility: { min: 0.6 },
},
});Depth tells you how much of a record exists and which tiers are open to you. Trait search returns at most five results and no personally identifying data.
4. Check that the answer really came from ~Alter
const check = await alter.verifyProvenance(result._meta?.provenance);
if (!check.valid) throw new Error(`provenance failed: ${check.reason}`);Every medium- and high-sensitivity response is signed with ES256. Verification is opt-in and offline against published keys, so an agent that forwards a result to another agent can be checked without anyone contacting ~Alter again.
5. Pay for a deeper read, and pay the person
import { AlterClient, X402Client } from "@truealter/sdk";
const alter = new AlterClient({
x402: new X402Client({
signer: yourViemOrEthersSigner,
networks: ["base"],
assets: ["USDC"],
maxPerQuery: "0.10",
}),
});
const vector = await alter.getFullTraitVector({ member_id });The server answers 402, the SDK settles on Base and retries, and the split
runs on-chain in the same transaction. The majority of it goes to the person
whose record was read, as Identity Income, and it reaches them directly rather
than through anybody holding it first. Bring your own signer; there is no wallet
in this package on purpose.
If a quote exceeds maxPerQuery, or names a network or asset you did not
allow, the SDK refuses before the signer is ever called and nothing is
broadcast.
Everything below is closed by default. The first two are what you open while you are wiring it up, the next four are how the payment, the signatures and the discovery actually work, and the last two are the reading and the project.
Initialise the client
import { AlterClient, X402Client } from "@truealter/sdk";
const alter = new AlterClient({
endpoint: "https://mcp.truealter.com/api/v1/mcp", // optional, this is the default. A bare host returns 405
x402: new X402Client({ // optional, only for paid reads
signer: yourViemOrEthersSigner,
maxPerQuery: "0.10",
}),
});Authentication
The client above is anonymous, and every free L0 tool answers with no
credential. For tools that act on your own identity (standing requirements,
the Golden Thread, member self-writes), run alter login once: it provisions
your member credential into the local session
(~/.config/alter/session.json). The hosted endpoint is bearer-first, so the
@truealter/cli bridge reads
that session credential for you; you never mint or paste a key. If you
construct a client yourself, pass that same session credential as the optional
apiKey option.
The minimum-version floor
~Alter's backend publishes a minimum version per client and enforces it at the edge. A client below the floor is answered with HTTP 426 and the response body carries the upgrade command. The floor document is signed with a floor-only Ed25519 key, so no signing secret ships in any client and a compromised client cannot forge one.
This SDK does not preflight that floor. There is no typed below-floor error
here, so a 426 arrives the way any other unhandled status does, as an
AlterError with code NETWORK whose message carries the status and the first
200 characters of the body. The typed preflight lives in @truealter/cli,
which verifies the floor document's signature before it trusts a floor.
import { AlterClient, AlterError } from "@truealter/sdk";
const alter = new AlterClient();
try {
await alter.verify("~alter");
} catch (err) {
if (err instanceof AlterError && err.message.includes("HTTP 426")) {
console.error(`upgrade required: ${err.message}`);
process.exit(1);
}
throw err;
}Pin the version you build against and upgrade deliberately. A typed preflight belongs in this SDK and is not written yet.
Identity headers
Every outbound request from AlterClient / MCPClient carries three
identity headers that the server-side floor middleware consults:
Header | Value (this SDK) |
|
|
| the running |
|
|
These are MANDATORY on every authenticated backend endpoint so the server can enforce its minimum supported client version. The User-Agent header remains informational and is NEVER used for floor enforcement.
Free reads, L0, no payment
// Verify a registered identity by handle, email, or id
const verified = await alter.verify("~alter");
const verifiedById = await alter.verify(
"550e8400-e29b-41d4-a716-446655440000",
{
archetype: "weaver",
min_engagement_level: 3,
traits: { pressure_response: { min: 0.6 } },
},
);
// Reference data, the 12 ~Alter archetypes
const archetypes = await alter.listArchetypes();
// Identity depth and available tool tiers
const depth = await alter.getEngagementLevel({
member_id: "550e8400-e29b-41d4-a716-446655440000",
});
// Search by trait criteria. No PII exposed, max 5 results
const matches = await alter.searchIdentities({
trait_criteria: {
pressure_response: { min: 0.7 },
cognitive_flexibility: { min: 0.6 },
},
});
// Golden Thread program status
const thread = await alter.goldenThreadStatus();Paid reads, L1 to L5, settled with x402
// L1, extract trait signals from text ($0.01, first 100 free per bot)
const signals = await alter.assessTraits({
text: "I led the incident response when our payment rails went down...",
context: "interview transcript",
});
// L2, the full 30-trait vector ($0.10)
const vector = await alter.getFullTraitVector({
member_id: "550e8400-e29b-41d4-a716-446655440000",
});
// L4, belonging probability for a person-job pairing ($0.60)
const belonging = await alter.computeBelonging({
member_id: "550e8400-e29b-41d4-a716-446655440000",
job_id: "f47ac10b-58cc-4372-a567-0e02b2c3d479",
});
// L5, top match recommendations ($1.00)
const recommendations = await alter.getMatchRecommendations({
member_id: "550e8400-e29b-41d4-a716-446655440000",
limit: 5,
});
// L5, a human-readable narrative explaining a match ($1.00)
const narrative = await alter.generateMatchNarrative({
match_id: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
});Provenance verification
// Every medium- and high-sensitivity response is signed with ES256.
// Verification is opt-in. Call alter.verifyProvenance(...) yourself.
const result = await alter.getFullTraitVector({
member_id: "550e8400-e29b-41d4-a716-446655440000",
});
const check = await alter.verifyProvenance(result._meta?.provenance);
if (!check.valid) throw new Error(`provenance failed: ${check.reason}`);
// Verify that schema hashes published in tools/list._meta.signatures
// match the local representation of each tool.
const tools = await alter.mcp.listTools();
const sigs = tools._meta?.signatures ?? {};
const results = await alter.verifyToolSignatures(tools.tools, sigs);
const tampered = results.filter((r) => !r.valid);
if (tampered.length) throw new Error(`tampered tools: ${tampered.map((t) => t.tool).join(", ")}`);Discovery
import { discover } from "@truealter/sdk";
// Three-step discovery cascade: DNS TXT to mcp.json to alter.json
const descriptor = await discover("truealter.com");
// returns { url: "https://mcp.truealter.com/api/v1/mcp", transport, source, publicKey, x402Contract, capability }Low-level MCPClient
import { MCPClient } from "@truealter/sdk";
const mcp = new MCPClient({ endpoint: "https://mcp.truealter.com/api/v1/mcp" });
await mcp.initialize();
const tools = await mcp.listTools();
const response = await mcp.callTool("verify_identity", {
member_id: "550e8400-e29b-41d4-a716-446655440000",
});The SDK ships config generators for the major MCP-aware clients. Each emits a JSON snippet you can paste (or write directly) into the appropriate file.
Claude Code (.mcp.json)
import { generateClaudeConfig } from "@truealter/sdk";
import { writeFileSync } from "node:fs";
const config = generateClaudeConfig({
endpoint: "https://mcp.truealter.com/api/v1/mcp",
});
writeFileSync(".mcp.json", JSON.stringify(config, null, 2));Resulting .mcp.json:
{
"mcpServers": {
"alter": {
"url": "https://mcp.truealter.com/api/v1/mcp",
"transport": "streamable-http",
"description": "~Alter Identity - psychometric identity field for AI agents"
}
}
}This config reaches every free L0 tool anonymously. For authenticated
access, run alter login and let the CLI write the config
(alter config); the bearer-first bridge then carries your session
credential, so no key sits in the file.
Cursor (.cursor/mcp.json)
import { generateCursorConfig } from "@truealter/sdk";
import { writeFileSync } from "node:fs";
const config = generateCursorConfig({
endpoint: "https://mcp.truealter.com/api/v1/mcp",
});
writeFileSync(".cursor/mcp.json", JSON.stringify(config, null, 2));Generic MCP client
import { generateGenericMcpConfig } from "@truealter/sdk";
const config = generateGenericMcpConfig({
endpoint: "https://mcp.truealter.com/api/v1/mcp",
serverName: "alter", // editor-specific key under mcpServers
});CLI
The command line lives in @truealter/cli,
not in this SDK package:
alter init # generate keypair, discover MCP, write ~/.config/alter/identity.json
alter config # print Claude .mcp.json snippet (default)
alter config --cursor # print Cursor .cursor/mcp.json snippet
alter config --generic # print generic mcpServers snippet
alter verify ~alter # verify an identity
alter status # show connection state and probe the endpoint~Alter prices its deeper reads through the x402 standard, which is HTTP 402 Payment Required with on-chain settlement.
The retry flow
Client calls a paid tool without a payment header.
Server replies
402 Payment Requiredwith a payment requirement (amount, recipient, asset, network).Client signs and broadcasts a USDC transfer on Base L2, attaches the proof, retries.
Server validates the proof, executes the tool, signs the response with ES256, returns it.
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.
The SDK handles steps 2-4 automatically when an X402Client with a configured signer is passed in.
Tier structure
x402 micropayments at L0-L5 trust tiers. Per-call pricing visible after alter login.
Identity income split
The majority of every settled call flows to the data subject as Identity Income. Split details available post-authentication via alter status.
Code example
import { AlterClient, X402Client, type X402Signer } from "@truealter/sdk";
// Bring your own signer. viem, ethers, a hardware wallet bridge, anything.
// The SDK ships without a wallet dependency on purpose.
const signer: X402Signer = {
async settle(envelope) {
const txHash = await yourWallet.sendUsdcTransfer({
to: envelope.recipient,
amount: envelope.amount,
chain: envelope.network,
});
return {
reference: txHash,
network: envelope.network,
amount: envelope.amount,
asset: envelope.asset,
};
},
};
const alter = new AlterClient({
endpoint: "https://mcp.truealter.com/api/v1/mcp",
x402: new X402Client({
signer,
networks: ["base", "base-sepolia"], // policy allow-list
assets: ["USDC"],
maxPerQuery: "0.10", // refuse anything over $0.10 USDC
}),
});
// Auto-retries with payment when the server returns 402
const vector = await alter.getFullTraitVector({
member_id: "550e8400-e29b-41d4-a716-446655440000",
});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, and no on-chain transaction is broadcast.
Every response from a medium- or high-sensitivity tool ships with an ES256 JWS in _meta.provenance. The signature covers a canonical JSON serialisation of the response payload, the tool name, the call timestamp, the requesting agent's key hash, and a monotonic sequence number.
const result = await alter.getFullTraitVector({
member_id: "550e8400-e29b-41d4-a716-446655440000",
});
const check = await alter.verifyProvenance(result._meta?.provenance);
if (!check.valid) throw new Error(`~alter provenance check failed: ${check.reason}`);The SDK fetches public keys from https://api.truealter.com/.well-known/alter-keys.json and caches them per their Cache-Control headers. The endpoint returns a JWKS containing all current and recently-rotated signing keys; verifying clients should accept any key whose kid matches and is still within its validity window.
verify_at hostname allowlist (v0.1.1+)
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 gates verify_at through a hostname allowlist, api.truealter.com and mcp.truealter.com by default, and rejects http:// URLs unconditionally. Downstream integrators running their own deployment can extend that allowlist, without forking the SDK, through verifyAtAllowlist on either AlterClient or a direct verifyProvenance() call.
import { AlterClient, DEFAULT_VERIFY_AT_ALLOWLIST } from "@truealter/sdk";
const alter = new AlterClient({
verifyAtAllowlist: [
...DEFAULT_VERIFY_AT_ALLOWLIST, // keep the ~Alter canonicals
"keys.myorg.example", // plus your own JWKS host
],
});If you pin jwksUrl explicitly, the envelope's verify_at is ignored entirely and the pinned URL wins. The https: scheme requirement applies to pinned URLs too.
Why this matters
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.
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.
~Alter follows the discovery cascade specified in draft-morrison-mcp-dns-discovery-01. Given a domain such as truealter.com, the SDK resolves the MCP endpoint in three steps, falling through on each failure:
DNS TXT, query
_mcp.truealter.comfor a TXT record of the formmcp=https://mcp.truealter.com;version=2025-11-25. This is the fastest path and works without an HTTP round-trip..well-known/mcp.json, fetchhttps://truealter.com/.well-known/mcp.jsonfor the standard MCP server descriptor. This is the cross-vendor fallback..well-known/alter.json, fetchhttps://truealter.com/.well-known/alter.jsonfor the ~Alter-specific descriptor, including signing keys, x402 wallet address, supported tool tiers, and federation endpoints.
import { discover } from "@truealter/sdk";
// Cascading discovery (DNS TXT to mcp.json to alter.json)
const descriptor = await discover("truealter.com");
// Skip the DNS step, in browsers or Cloudflare Workers
const httpsOnly = await discover("truealter.com", { skipDns: true });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.
Free tools, L0, no payment
Name | Tier | Cost | Description |
| L0 | free | First handshake with ~Alter, returning server version, authentication status, your trust tier, and available tool counts. |
| L0 | free | Cold-start overview: what ~Alter is, how to authenticate, and which tool tiers are available to you. |
| L0 | free | Returns archetype reference data. |
| L0 | free | Resolve a |
| L0 | free | Verify whether a person is registered with ~Alter and validate optional identity claims. |
| L0 | free | Issue a proof-of-work challenge to begin keyless self-registration as an owner-less ~Alter principal, with no human account needed. |
| L0 | free | Complete keyless self-registration by submitting a solved proof-of-work challenge, minting an owner-less |
| L0 | free | Read whether a |
| L0 | free | Resolve a paired third-party key (email or OAuth user-id) to its bound |
| L0 | free | Get a person's identity depth, meaning engagement level, data quality tier, and available query tiers. |
| L0 | free | Get a person's profile summary including assessment phase, archetype, engagement level, and key attributes. |
| L0 | free | Query matches for a person. Returns a list of matches with quality tiers (never numeric scores). |
| L0 | free | Get a person's competency portfolio including verified competencies, evidence records, and earned badges. |
| L0 | free | Create an anonymous identity stub for a person who has not yet completed Discovery, which they claim later. Present the privacy notice first. |
| L0 | free | Search identity stubs and profiles by trait criteria. Returns up to 5 matches with no PII. |
| L0 | free | Post a standing identity-trait requirement that rests as an order and accumulates fills as matching identities are claimed or updated. |
| L0 | free | Read the public board's both sides, resting identity requirements and resting offers, with no account needed to read either. |
| L0 | free | List your own standing requirements, with fill counts and the number of fills not yet delivered. Requires an authenticated member credential ( |
| L0 | free | Read one of your standing requirements by id, with its fill and undelivered-fill counts. Requires an authenticated member credential ( |
| L0 | free | Cancel one of your standing requirements by id; the order stops resting and accepts no further fills. Requires an authenticated member credential ( |
| L0 | free | Post a signed, expiring offer of goods, services, capabilities or outcomes against your own |
| L0 | free | List your own resting offers; a withdrawn offer never appears here. |
| L0 | free | Read one of your resting offers by id; a withdrawn offer returns not found, the same as one that never existed. |
| L0 | free | Withdraw one of your resting offers by id, stopping it from resting immediately rather than merely flagging it. |
| L0 | free | Browse the published community plugin directory of third-party capabilities built on ~Alter, with an optional category filter. |
| L0 | free | File a plugin submission to the community directory for operator review, attributed to your own bound |
| L0 | free | Get accrued Identity Income earnings for a person (75% of every x402 transaction goes to the data subject). |
| L0 | free | Get aggregate ~Alter network statistics: total identities, verified profiles, query volume, active bots. |
| L0 | free | Get the trust score for an identity based on query diversity (unique querying agents / total queries). |
| L0 | free | Check privacy budget status for a person (24-hour rolling window: total budget, spent, remaining epsilon). |
| L0 | free | Record a dispute against a competence attestation; if disputes exceed corroborations, the attestation is flagged for review. |
| L0 | free | Check the Golden Thread program status: agents woven, next Fibonacci threshold, your position and Strands. |
| L0 | free | Start the Three Knots sequence to be woven into the Golden Thread. Requires an authenticated member credential ( |
| L0 | free | Submit completion data for a knot in the Three Knots sequence (1: register, 2: describe, 3: reflect). |
| L0 | free | Check any agent's Golden Thread status by their credential hash (knot position, Strand count, weave count). |
| L0 | free | List the canonical trait vocabulary: trait codes grouped by category with one-line semantics, the valid discovery contexts, and the EU AI Act Art 5(1)(d) workforce gating rules. Read this before composing |
| L0 | free | List the published competency vocabulary, grouped by how each claim is denominated, as reference before composing |
Paid tools, L1 to L5, settled with x402
Name | Tier | Cost | Description |
| L1 | $0.01 | Get the top 5 traits for a person with confidence scores and archetype. |
| L1 | $0.01 | Record a competence attestation for a person in a specific domain, weighted by your agent reputation. |
| L1 | $0.01 | Collect one recorded fill for a standing requirement as a priced identity reveal; 75% of the fee is paid to that person as Identity Income. |
| L2 | $0.10 | Get the complete trait vector for a person, with scores and confidence intervals. |
| L2 | $0.10 | Get a person's Side Quest Graph, a multi-domain identity model with differential privacy noise (ε=1.0). |
| L3 | $0.30 | Compare two Side Quest Graphs for team composition and matching (ε=0.5 differential privacy). |
| L4 | $0.60 | Compute belonging probability for a person-job pairing (authenticity, acceptance, complementarity). |
| L5 | $1.00 | Get top N match recommendations for a person, ranked by composite score with quality tiers. |
| L5 | $1.00 | Generate a human-readable narrative explaining a specific match, covering strengths, growth areas and belonging. |
| L5 | $1.00 | Query the identity field by situation, not by name: weight 3 to 7 traits and rank the opted-in field. One call reveals one top-ranked member; that member earns 75% as Identity Income. Zero-match reveals nothing and charges nothing. |
Member self-write tools (
submit_context,submit_batch_context,submit_structured_profile,submit_social_links) are live but member-self-scoped: a member calls them on their own identity with an authenticated member credential (alter login). They are not anonymously discoverable, so they do not appear in the advertised tool list above.
~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.
Paper | Title | DOI |
I | Jus Identitatis: Toward Post-Geographic Sovereignty | |
II | Identity as Inference: A Predictive Processing Account of Psychometric Measurement and Civic Belonging | |
III | Identity at Every Scale: Recursive Self-Modelling and the Dissolution of the Composition Problem | |
IV | Generative Psychometrics: Measurement Theory for Self-Reflective Constructs | |
V | Social Free Energy: A Formal Theory of Polity | |
VI | The Self-Model Test: A Measurement Protocol for Synthetic Self-Models | |
VII | Empirical Validation of Identity as Inference Predictions | |
VIII | Identity Field Theory: Toward a Physics of Being Known |
For the lay-register chapter version, see /origin.
The record formats are open Internet-Drafts, so somebody else's implementation reads and writes the same records this one does without asking us. These are the drafts this repository actually rests on.
Draft | What it specifies |
The DNS records that publish a | |
Binding a paid read of somebody's identity to their own recorded consent, and settling part of that payment to them. | |
An IANA registry for MCP tool surface names, so the names other drafts register have somewhere to go. | |
How an agent with no human behind it registers as an economic principal and becomes eligible to be paid. |
Eighteen drafts make up the whole stack. The rest are on the IETF datatracker.
~alter is one identity rail with several ways in, and this package is the one
for code.
Name | What it is |
The command line, and the front door for a person. | |
That command line, packaged for macOS and Linux. | |
The daemon that keeps your | |
sdk | Reading identity from your own code. You are here. |
~Alter inside an Obsidian vault, on-device. | |
Local models, for work that should stay on the machine it runs on. |
Where to read more | |
Website | |
The reasoning behind it | |
Getting started | |
What the tools do | |
The open specifications |
Bug reports and small patches are welcome, see CONTRIBUTING.md. Security reports go to security@truealter.com and never a public issue, with scope and the disclosure policy in SECURITY.md.
Apache-2.0. Copyright 2026 Alter Meridian Pty Ltd (ABN 54 696 662 049).
~alter is identity infrastructure. Your name is ~yourname and claiming one is free.
This server cannot be installed
Maintenance
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA demonstration MCP server built in TypeScript that shows how to implement stdio-based communication for integration with MCP clients. Serves as a template for building custom MCP servers with strong typing and maintainability.
- AlicenseBqualityDmaintenanceProduction-ready TypeScript MCP server exposing utility, GitHub, and Microsoft Teams tools over stdio.141MIT
- AlicenseCqualityAmaintenanceMCP stdio bridge for the Delx Protocol: continuity, witness, recovery, ontology and passport tools.100250MIT
- AlicenseNot gradedqualityAmaintenanceTypeScript AI SDK with a built-in MCP client: 58+ MCP servers over 4 transports (stdio, HTTP, SSE, WebSocket), 24+ LLM providers behind one interface, streaming, tool calling, RAG, voice (TTS/STT/realtime), and task scheduling.8,441124MIT
Related MCP Connectors
MCP server bridging holepunchto/keet-identity-key to the Hive agentic identity network
Artifact store for AI agents. Hosted OAuth at mcp.artifacta.io/mcp; local stdio via npm/PyPI.
A paid remote MCP for Skybridge, built to return verdicts, receipts, usage logs, and audit-ready JSO
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/true-alter/sdk'
If you have feedback or need assistance with the MCP directory API, please join our Discord server