@saihm/mcp-server-pro
Advanced tools
+1
-0
| import type { WireIdentityRecord } from '@saihm/client-pro'; | ||
| export declare const DEFAULT_ENDPOINT = "https://saihm.coti.global/mcp"; | ||
| declare const QUOTA_NAG_THRESHOLDS: readonly [80, 95, 100]; | ||
@@ -3,0 +4,0 @@ type QuotaNagThreshold = (typeof QUOTA_NAG_THRESHOLDS)[number]; |
+21
-7
@@ -9,2 +9,11 @@ import { randomBytes } from 'node:crypto'; | ||
| const MAX_SEQ = (1n << 64n) - 1n; | ||
| export const DEFAULT_ENDPOINT = 'https://saihm.coti.global/mcp'; | ||
| function setupHint() { | ||
| return selfJoinEnabled() | ||
| ? ' To start free with no configuration, ask me to "Join SAIHM" (the saihm_join tool).' + | ||
| ' To use a different operator, set SAIHM_ENDPOINT_URL to its endpoint.' | ||
| : ' Self-join is off (SAIHM_SELF_JOIN=0), so supply a master secret via' + | ||
| ' SAIHM_MASTER_SECRET_FILE or SAIHM_MASTER_SECRET_HEX. Unset SAIHM_SELF_JOIN' + | ||
| ' to start free with no configuration instead.'; | ||
| } | ||
| function assertEndpointUrl(endpoint) { | ||
@@ -329,6 +338,9 @@ let url; | ||
| static bootFromEnv() { | ||
| const endpoint = process.env.SAIHM_ENDPOINT_URL; | ||
| const endpoint = process.env.SAIHM_ENDPOINT_URL === undefined | ||
| ? DEFAULT_ENDPOINT | ||
| : process.env.SAIHM_ENDPOINT_URL; | ||
| const auth = process.env.SAIHM_AUTH_HEADER; | ||
| if (!endpoint) | ||
| throw new Error('SAIHM_ENDPOINT_URL env var required'); | ||
| throw new Error('SAIHM_ENDPOINT_URL is set but empty.' + setupHint()); | ||
| assertEndpointUrl(endpoint); | ||
| const secretFile = process.env.SAIHM_MASTER_SECRET_FILE; | ||
@@ -341,3 +353,4 @@ let secretHex; | ||
| catch { | ||
| throw new Error(`SAIHM_MASTER_SECRET_FILE could not be read: ${secretFile}`); | ||
| throw new Error(`SAIHM_MASTER_SECRET_FILE could not be read: ${secretFile}.` + | ||
| setupHint()); | ||
| } | ||
@@ -363,3 +376,3 @@ try { | ||
| catch { | ||
| throw new Error(`self-join identity file could not be read: ${p}`); | ||
| throw new Error(`self-join identity file could not be read: ${p}.` + setupHint()); | ||
| } | ||
@@ -371,3 +384,4 @@ } | ||
| throw new Error('No SAIHM memory yet on this device. Ask me to "Join SAIHM" first (the saihm_join tool) to create your free memory, then try again.'); | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX (or SAIHM_MASTER_SECRET_FILE) env var required (>= 64 hex chars)'); | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX (or SAIHM_MASTER_SECRET_FILE) env var required (>= 64 hex chars).' + | ||
| setupHint()); | ||
| } | ||
@@ -379,7 +393,7 @@ let master; | ||
| catch { | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX must be canonical lowercase hex'); | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX must be canonical lowercase hex.' + setupHint()); | ||
| } | ||
| if (master.length < 32) { | ||
| master.fill(0); | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX must decode to >= 32 bytes'); | ||
| throw new Error('SAIHM_MASTER_SECRET_HEX must decode to >= 32 bytes.' + setupHint()); | ||
| } | ||
@@ -386,0 +400,0 @@ const optTier = process.env.SAIHM_TIER ?? (selfJoinEnabled() ? 'FREE' : undefined); |
+1
-1
@@ -1,3 +0,3 @@ | ||
| export { SaihmProClient, SaihmEndpointError } from './client.js'; | ||
| export { SaihmProClient, SaihmEndpointError, DEFAULT_ENDPOINT } from './client.js'; | ||
| export { KeySubstitutionError } from '@saihm/client-pro'; | ||
| export type { RememberResult, RecalledCell, ForgetResult, StatusSnapshot, ShareResult, RevokeResult, RememberOpts, ShareGrant, SharedReadGrant, SaihmProClientOpts, } from './client.js'; |
+1
-1
@@ -1,2 +0,2 @@ | ||
| export { SaihmProClient, SaihmEndpointError } from './client.js'; | ||
| export { SaihmProClient, SaihmEndpointError, DEFAULT_ENDPOINT } from './client.js'; | ||
| export { KeySubstitutionError } from '@saihm/client-pro'; |
+1
-1
| { | ||
| "name": "@saihm/mcp-server-pro", | ||
| "version": "0.2.0", | ||
| "version": "0.2.1", | ||
| "mcpName": "io.github.SAIHM-Admin/saihm-mcp-server-pro", | ||
@@ -5,0 +5,0 @@ "description": "Sovereign encrypted memory for AI agents, sealed on your own machine. Start free with no card and no master secret — just ask your agent to \"Join SAIHM\". Seals client-side via @saihm/client-pro (ML-DSA-65 identity, per-cell AES-256-GCM DEK wrapped under a client KEK, ML-KEM-768 authenticated sharing) and POSTs opaque ciphertext to the blind, non-custodial SAIHM /mcp endpoint. The master secret, KEK, and plaintext never leave this process. Apache-2.0.", |
+1
-1
@@ -230,3 +230,3 @@ # @saihm/mcp-server-pro | ||
| | -------------------------- | ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| | `SAIHM_ENDPOINT_URL` | yes | `https://…/mcp` (or `http://` only for `127.0.0.1`/`localhost`). | | ||
| | `SAIHM_ENDPOINT_URL` | no | `https://…/mcp` (or `http://` only for `127.0.0.1`/`localhost`). **Defaults to `https://saihm.coti.global/mcp`** — set it only to point at a different operator. | | ||
| | `SAIHM_AUTH_HEADER` | no | `Bearer <JWT>`, used verbatim. **Omit to self-onboard** (recommended): the client mints + auto-refreshes its own short-lived JWT from the master secret, so you paste one config once and never re-paste a token. | | ||
@@ -233,0 +233,0 @@ | `SAIHM_PAYMENT_METHOD` | paid self-onboard | Your entitlement rail (e.g. `stripe`) for a paid tier. **Not used by the FREE tier** — activate free with `free-join` (no card). Ignored when `SAIHM_AUTH_HEADER` is set. | |
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
98869
0.92%1801
0.84%22
4.76%