obyte-mcp 0.1.1 → 0.2.0
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 +241 -185
- package/dist/amounts.d.ts +43 -0
- package/dist/amounts.js +117 -0
- package/dist/amounts.js.map +1 -0
- package/dist/cliArgs.d.ts +8 -2
- package/dist/cliArgs.js +37 -4
- package/dist/cliArgs.js.map +1 -1
- package/dist/config.d.ts +4 -1
- package/dist/config.js +46 -17
- package/dist/config.js.map +1 -1
- package/dist/configSnippets.d.ts +19 -4
- package/dist/configSnippets.js +97 -48
- package/dist/configSnippets.js.map +1 -1
- package/dist/constants.d.ts +3 -1
- package/dist/constants.js +3 -1
- package/dist/constants.js.map +1 -1
- package/dist/envelope.d.ts +3 -3
- package/dist/envelope.js.map +1 -1
- package/dist/index.js +29 -8
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +10 -0
- package/dist/install.js +159 -0
- package/dist/install.js.map +1 -0
- package/dist/obyteClient.d.ts +10 -2
- package/dist/obyteClient.js +8 -0
- package/dist/obyteClient.js.map +1 -1
- package/dist/prompts.js +26 -18
- package/dist/prompts.js.map +1 -1
- package/dist/resources.js +10 -2
- package/dist/resources.js.map +1 -1
- package/dist/schemas.d.ts +121 -1
- package/dist/schemas.js +34 -17
- package/dist/schemas.js.map +1 -1
- package/dist/server.js +26 -4
- package/dist/server.js.map +1 -1
- package/dist/setup.js +9 -3
- package/dist/setup.js.map +1 -1
- package/dist/symbols.js +2 -1
- package/dist/symbols.js.map +1 -1
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +153 -77
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +24 -9
- package/package.json +5 -2
- package/server.json +25 -13
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { AaStateVarsReader, SymbolOptions } from "./symbols.js";
|
|
2
|
+
import type { Network } from "./types.js";
|
|
3
|
+
export declare const BASE_DECIMALS = 9;
|
|
4
|
+
export declare const AMOUNTS_NOTE = "Raw on-ledger amounts are integers in the asset's smallest units. display_total is already divided by 10^decimals; present display values to users, never raw integers. base is GBYTE with 9 decimals. explorer_asset_url lists the asset's description and holders (explorer amounts are already in display units).";
|
|
5
|
+
/** Explorer page listing an asset's description and holders. */
|
|
6
|
+
export declare function assetExplorerUrl(network: Network, symbolOrAsset: string): string;
|
|
7
|
+
export interface AssetAmountSummary {
|
|
8
|
+
asset: string;
|
|
9
|
+
symbol: string | null;
|
|
10
|
+
decimals: number | null;
|
|
11
|
+
raw_total: number;
|
|
12
|
+
display_total: string | null;
|
|
13
|
+
explorer_asset_url?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface BalanceAmountSummary {
|
|
16
|
+
totals_by_asset: Record<string, AssetAmountSummary>;
|
|
17
|
+
amounts_note: string;
|
|
18
|
+
unresolved_assets?: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Converts a raw smallest-units integer into a human display string without
|
|
22
|
+
* floating point artifacts, e.g. formatAmount(2500000000, 9) === "2.5".
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatAmount(rawAmount: number, decimals: number): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Sums raw amounts per asset from either hub balance shape:
|
|
27
|
+
* - get_balances: { address: { asset: { stable, pending } } }
|
|
28
|
+
* - AA balances: { asset: number }
|
|
29
|
+
*/
|
|
30
|
+
export declare function collectAssetTotals(balances: unknown): Record<string, number>;
|
|
31
|
+
export interface SummarizeOptions extends SymbolOptions {
|
|
32
|
+
resolve?: boolean;
|
|
33
|
+
maxResolvedAssets?: number;
|
|
34
|
+
/** When set, each asset summary gets an explorer_asset_url for that network. */
|
|
35
|
+
network?: Network;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds a per-asset totals summary with symbols, decimals, and display amounts.
|
|
39
|
+
* base always resolves to GBYTE/9 without touching the registry; custom assets
|
|
40
|
+
* are resolved through the registry when available, failures degrade to nulls
|
|
41
|
+
* and are listed in unresolved_assets so agents know to resolve before display.
|
|
42
|
+
*/
|
|
43
|
+
export declare function summarizeBalanceAmounts(reader: AaStateVarsReader, balances: unknown, options?: SummarizeOptions): Promise<BalanceAmountSummary>;
|
package/dist/amounts.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { MAINNET_EXPLORER, TESTNET_EXPLORER } from "./constants.js";
|
|
2
|
+
import { isPlainObject } from "./jsonUtils.js";
|
|
3
|
+
import { getDecimalsBySymbolOrAsset, getSymbolByAsset } from "./symbols.js";
|
|
4
|
+
export const BASE_DECIMALS = 9;
|
|
5
|
+
export const AMOUNTS_NOTE = "Raw on-ledger amounts are integers in the asset's smallest units. display_total is already divided by 10^decimals; present display values to users, never raw integers. base is GBYTE with 9 decimals. explorer_asset_url lists the asset's description and holders (explorer amounts are already in display units).";
|
|
6
|
+
/** Explorer page listing an asset's description and holders. */
|
|
7
|
+
export function assetExplorerUrl(network, symbolOrAsset) {
|
|
8
|
+
const base = network === "testnet" ? TESTNET_EXPLORER : MAINNET_EXPLORER;
|
|
9
|
+
return `${base}/asset/${encodeURIComponent(symbolOrAsset)}`;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Converts a raw smallest-units integer into a human display string without
|
|
13
|
+
* floating point artifacts, e.g. formatAmount(2500000000, 9) === "2.5".
|
|
14
|
+
*/
|
|
15
|
+
export function formatAmount(rawAmount, decimals) {
|
|
16
|
+
if (typeof rawAmount !== "number" || !Number.isFinite(rawAmount))
|
|
17
|
+
return null;
|
|
18
|
+
if (!Number.isInteger(decimals) || decimals < 0 || decimals > 30)
|
|
19
|
+
return null;
|
|
20
|
+
if (decimals === 0)
|
|
21
|
+
return String(rawAmount);
|
|
22
|
+
if (!Number.isSafeInteger(rawAmount))
|
|
23
|
+
return String(rawAmount / 10 ** decimals);
|
|
24
|
+
const negative = rawAmount < 0;
|
|
25
|
+
const digits = String(Math.abs(rawAmount)).padStart(decimals + 1, "0");
|
|
26
|
+
const whole = digits.slice(0, -decimals);
|
|
27
|
+
const frac = digits.slice(-decimals).replace(/0+$/, "");
|
|
28
|
+
return `${negative ? "-" : ""}${whole}${frac ? `.${frac}` : ""}`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sums raw amounts per asset from either hub balance shape:
|
|
32
|
+
* - get_balances: { address: { asset: { stable, pending } } }
|
|
33
|
+
* - AA balances: { asset: number }
|
|
34
|
+
*/
|
|
35
|
+
export function collectAssetTotals(balances) {
|
|
36
|
+
const totals = {};
|
|
37
|
+
if (!isPlainObject(balances))
|
|
38
|
+
return totals;
|
|
39
|
+
const add = (asset, value) => {
|
|
40
|
+
let raw;
|
|
41
|
+
if (typeof value === "number") {
|
|
42
|
+
raw = value;
|
|
43
|
+
}
|
|
44
|
+
else if (isPlainObject(value)) {
|
|
45
|
+
const stable = typeof value.stable === "number" ? value.stable : 0;
|
|
46
|
+
const pending = typeof value.pending === "number" ? value.pending : 0;
|
|
47
|
+
raw = stable + pending;
|
|
48
|
+
}
|
|
49
|
+
if (raw !== undefined)
|
|
50
|
+
totals[asset] = (totals[asset] ?? 0) + raw;
|
|
51
|
+
};
|
|
52
|
+
for (const [key, entry] of Object.entries(balances)) {
|
|
53
|
+
const values = isPlainObject(entry) ? Object.values(entry) : [];
|
|
54
|
+
if (values.length > 0 && values.every((value) => isPlainObject(value))) {
|
|
55
|
+
// Address -> asset map (get_balances shape); sum across addresses.
|
|
56
|
+
for (const [asset, value] of Object.entries(entry))
|
|
57
|
+
add(asset, value);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
add(key, entry);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return totals;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Builds a per-asset totals summary with symbols, decimals, and display amounts.
|
|
67
|
+
* base always resolves to GBYTE/9 without touching the registry; custom assets
|
|
68
|
+
* are resolved through the registry when available, failures degrade to nulls
|
|
69
|
+
* and are listed in unresolved_assets so agents know to resolve before display.
|
|
70
|
+
*/
|
|
71
|
+
export async function summarizeBalanceAmounts(reader, balances, options = {}) {
|
|
72
|
+
const totals = collectAssetTotals(balances);
|
|
73
|
+
const customAssets = Object.keys(totals).filter((asset) => asset !== "base");
|
|
74
|
+
const maxResolved = options.maxResolvedAssets ?? 10;
|
|
75
|
+
const toResolve = options.resolve === false ? [] : customAssets.slice(0, maxResolved);
|
|
76
|
+
const resolved = new Map(await Promise.all(toResolve.map(async (asset) => {
|
|
77
|
+
const [symbol, decimals] = await Promise.all([
|
|
78
|
+
getSymbolByAsset(reader, asset, options).catch(() => null),
|
|
79
|
+
getDecimalsBySymbolOrAsset(reader, asset, options).catch(() => null)
|
|
80
|
+
]);
|
|
81
|
+
return [asset, { symbol, decimals }];
|
|
82
|
+
})));
|
|
83
|
+
const totalsByAsset = {};
|
|
84
|
+
const unresolved = [];
|
|
85
|
+
for (const [asset, rawTotal] of Object.entries(totals)) {
|
|
86
|
+
if (asset === "base") {
|
|
87
|
+
totalsByAsset[asset] = {
|
|
88
|
+
asset,
|
|
89
|
+
symbol: "GBYTE",
|
|
90
|
+
decimals: BASE_DECIMALS,
|
|
91
|
+
raw_total: rawTotal,
|
|
92
|
+
display_total: formatAmount(rawTotal, BASE_DECIMALS),
|
|
93
|
+
...(options.network ? { explorer_asset_url: assetExplorerUrl(options.network, "GBYTE") } : {})
|
|
94
|
+
};
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
const info = resolved.get(asset);
|
|
98
|
+
const decimals = info?.decimals ?? null;
|
|
99
|
+
const symbol = info?.symbol ?? null;
|
|
100
|
+
totalsByAsset[asset] = {
|
|
101
|
+
asset,
|
|
102
|
+
symbol,
|
|
103
|
+
decimals,
|
|
104
|
+
raw_total: rawTotal,
|
|
105
|
+
display_total: decimals === null ? null : formatAmount(rawTotal, decimals),
|
|
106
|
+
// Unknown assets get a prefix fallback "symbol"; only registry-confirmed symbols make clean explorer URLs.
|
|
107
|
+
...(options.network ? { explorer_asset_url: assetExplorerUrl(options.network, decimals !== null && symbol ? symbol : asset) } : {})
|
|
108
|
+
};
|
|
109
|
+
if (decimals === null)
|
|
110
|
+
unresolved.push(asset);
|
|
111
|
+
}
|
|
112
|
+
const summary = { totals_by_asset: totalsByAsset, amounts_note: AMOUNTS_NOTE };
|
|
113
|
+
if (unresolved.length > 0)
|
|
114
|
+
summary.unresolved_assets = unresolved;
|
|
115
|
+
return summary;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=amounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amounts.js","sourceRoot":"","sources":["../src/amounts.ts"],"names":[],"mappings":"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"}
|
package/dist/cliArgs.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { CliOptions } from "./types.js";
|
|
2
|
-
export type CommandName = "server" | "setup" | "doctor" | "help" | "version";
|
|
3
|
-
export type ClientName = "codex" | "claude-desktop" | "claude-code";
|
|
2
|
+
export type CommandName = "server" | "setup" | "install" | "doctor" | "help" | "version";
|
|
3
|
+
export type ClientName = "codex" | "claude-desktop" | "claude-code" | "vscode";
|
|
4
|
+
export declare const CLIENT_NAMES: readonly ClientName[];
|
|
4
5
|
export interface ParsedCli {
|
|
5
6
|
command: CommandName;
|
|
6
7
|
options: CliOptions;
|
|
@@ -8,6 +9,11 @@ export interface ParsedCli {
|
|
|
8
9
|
printOnly: boolean;
|
|
9
10
|
client?: ClientName;
|
|
10
11
|
};
|
|
12
|
+
install: {
|
|
13
|
+
dryRun: boolean;
|
|
14
|
+
client?: ClientName;
|
|
15
|
+
serverName?: string;
|
|
16
|
+
};
|
|
11
17
|
doctor: {
|
|
12
18
|
json: boolean;
|
|
13
19
|
};
|
package/dist/cliArgs.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { ObyteMcpError } from "./errors.js";
|
|
2
2
|
import { parseNetwork } from "./config.js";
|
|
3
|
+
export const CLIENT_NAMES = ["vscode", "codex", "claude-desktop", "claude-code"];
|
|
3
4
|
export function parseCliArgs(argv) {
|
|
4
5
|
const parsed = {
|
|
5
6
|
command: "server",
|
|
6
7
|
options: {},
|
|
7
8
|
setup: { printOnly: false },
|
|
9
|
+
install: { dryRun: false },
|
|
8
10
|
doctor: { json: false }
|
|
9
11
|
};
|
|
10
12
|
const args = [...argv];
|
|
11
13
|
const first = args[0];
|
|
12
|
-
if (first === "setup" || first === "doctor") {
|
|
14
|
+
if (first === "setup" || first === "install" || first === "doctor") {
|
|
13
15
|
parsed.command = first;
|
|
14
16
|
args.shift();
|
|
15
17
|
}
|
|
@@ -29,6 +31,10 @@ export function parseCliArgs(argv) {
|
|
|
29
31
|
parsed.setup.printOnly = true;
|
|
30
32
|
continue;
|
|
31
33
|
}
|
|
34
|
+
if (arg === "--dry-run") {
|
|
35
|
+
parsed.install.dryRun = true;
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
32
38
|
if (arg === "--json") {
|
|
33
39
|
parsed.doctor.json = true;
|
|
34
40
|
continue;
|
|
@@ -49,6 +55,26 @@ export function parseCliArgs(argv) {
|
|
|
49
55
|
index += 1;
|
|
50
56
|
continue;
|
|
51
57
|
}
|
|
58
|
+
if (arg === "--mainnet-hub") {
|
|
59
|
+
parsed.options.mainnetHubAddress = requireString(next, "--mainnet-hub");
|
|
60
|
+
index += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (arg === "--testnet-hub") {
|
|
64
|
+
parsed.options.testnetHubAddress = requireString(next, "--testnet-hub");
|
|
65
|
+
index += 1;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
if (arg === "--mainnet-token-registry") {
|
|
69
|
+
parsed.options.mainnetTokenRegistryAddress = requireString(next, "--mainnet-token-registry");
|
|
70
|
+
index += 1;
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (arg === "--testnet-token-registry") {
|
|
74
|
+
parsed.options.testnetTokenRegistryAddress = requireString(next, "--testnet-token-registry");
|
|
75
|
+
index += 1;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
52
78
|
if (arg === "--timeout-ms") {
|
|
53
79
|
parsed.options.timeoutMs = parseInteger(requireString(next, "--timeout-ms"), "--timeout-ms");
|
|
54
80
|
index += 1;
|
|
@@ -65,7 +91,14 @@ export function parseCliArgs(argv) {
|
|
|
65
91
|
continue;
|
|
66
92
|
}
|
|
67
93
|
if (arg === "--client") {
|
|
68
|
-
|
|
94
|
+
const client = parseClient(requireString(next, "--client"));
|
|
95
|
+
parsed.setup.client = client;
|
|
96
|
+
parsed.install.client = client;
|
|
97
|
+
index += 1;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (arg === "--name") {
|
|
101
|
+
parsed.install.serverName = requireString(next, "--name");
|
|
69
102
|
index += 1;
|
|
70
103
|
continue;
|
|
71
104
|
}
|
|
@@ -90,8 +123,8 @@ function parseInteger(value, label) {
|
|
|
90
123
|
return number;
|
|
91
124
|
}
|
|
92
125
|
function parseClient(value) {
|
|
93
|
-
if (value === "codex" || value === "claude-desktop" || value === "claude-code")
|
|
126
|
+
if (value === "codex" || value === "claude-desktop" || value === "claude-code" || value === "vscode")
|
|
94
127
|
return value;
|
|
95
|
-
throw new ObyteMcpError("CONFIG_ERROR", "--client must be codex, claude-desktop, or claude-code", { value });
|
|
128
|
+
throw new ObyteMcpError("CONFIG_ERROR", "--client must be vscode, codex, claude-desktop, or claude-code", { value });
|
|
96
129
|
}
|
|
97
130
|
//# sourceMappingURL=cliArgs.js.map
|
package/dist/cliArgs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cliArgs.js","sourceRoot":"","sources":["../src/cliArgs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cliArgs.js","sourceRoot":"","sources":["../src/cliArgs.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import type { CliOptions, Network, RuntimeConfig } from "./types.js";
|
|
1
|
+
import type { CliOptions, EnvelopeConfig, Network, RuntimeConfig } from "./types.js";
|
|
2
|
+
export declare const NETWORKS: readonly Network[];
|
|
2
3
|
export declare function parseNetwork(value: string | undefined, source: string): Network | undefined;
|
|
3
4
|
export declare function buildRuntimeConfig(env?: NodeJS.ProcessEnv, cli?: CliOptions): RuntimeConfig;
|
|
5
|
+
/** Narrows the full runtime config to the fields the response envelope needs for one network. */
|
|
6
|
+
export declare function envelopeConfig(config: RuntimeConfig, network: Network): EnvelopeConfig;
|
|
4
7
|
export declare function normalizeHubAddress(value: string | undefined): string | undefined;
|
package/dist/config.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_MAX_CONCURRENCY, DEFAULT_MAX_OUTPUT_BYTES, DEFAULT_TIMEOUT_MS, MAINNET_HUB, MAINNET_TOKEN_REGISTRY_ADDRESS, MAX_MAX_CONCURRENCY, MAX_MAX_OUTPUT_BYTES, MAX_TIMEOUT_MS, MIN_MAX_CONCURRENCY, MIN_MAX_OUTPUT_BYTES, MIN_TIMEOUT_MS, TESTNET_HUB } from "./constants.js";
|
|
2
2
|
import { ObyteMcpError } from "./errors.js";
|
|
3
|
+
export const NETWORKS = ["mainnet", "testnet"];
|
|
3
4
|
export function parseNetwork(value, source) {
|
|
4
5
|
if (value === undefined || value === "")
|
|
5
6
|
return undefined;
|
|
@@ -9,36 +10,64 @@ export function parseNetwork(value, source) {
|
|
|
9
10
|
}
|
|
10
11
|
export function buildRuntimeConfig(env = process.env, cli = {}) {
|
|
11
12
|
const envNetwork = parseNetwork(env.OBYTE_NETWORK, "OBYTE_NETWORK");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const envRegistry = normalizeOptionalString(env.OBYTE_TOKEN_REGISTRY_ADDRESS);
|
|
19
|
-
const cliRegistry = normalizeOptionalString(cli.tokenRegistryAddress);
|
|
20
|
-
const tokenRegistryAddress = envRegistry ?? cliRegistry ?? (network === "mainnet" ? MAINNET_TOKEN_REGISTRY_ADDRESS : undefined);
|
|
21
|
-
const registrySource = envRegistry ? "env" : cliRegistry ? "cli" : network === "mainnet" ? "default" : "unset";
|
|
13
|
+
const defaultNetwork = envNetwork ?? cli.network ?? "mainnet";
|
|
14
|
+
const defaultNetworkSource = envNetwork ? "env" : cli.network ? "cli" : "default";
|
|
15
|
+
const networks = {
|
|
16
|
+
mainnet: buildNetworkConfig("mainnet", env, cli, defaultNetwork),
|
|
17
|
+
testnet: buildNetworkConfig("testnet", env, cli, defaultNetwork)
|
|
18
|
+
};
|
|
22
19
|
const timeoutMs = pickBoundedNumber(env.OBYTE_REQUEST_TIMEOUT_MS, cli.timeoutMs, DEFAULT_TIMEOUT_MS, MIN_TIMEOUT_MS, MAX_TIMEOUT_MS, "OBYTE_REQUEST_TIMEOUT_MS");
|
|
23
20
|
const maxConcurrency = pickBoundedNumber(env.OBYTE_MAX_CONCURRENCY, cli.maxConcurrency, DEFAULT_MAX_CONCURRENCY, MIN_MAX_CONCURRENCY, MAX_MAX_CONCURRENCY, "OBYTE_MAX_CONCURRENCY");
|
|
24
21
|
const maxOutputBytes = pickBoundedNumber(env.OBYTE_MAX_OUTPUT_BYTES, cli.maxOutputBytes, DEFAULT_MAX_OUTPUT_BYTES, MIN_MAX_OUTPUT_BYTES, MAX_MAX_OUTPUT_BYTES, "OBYTE_MAX_OUTPUT_BYTES");
|
|
25
22
|
return {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
23
|
+
defaultNetwork,
|
|
24
|
+
defaultNetworkSource,
|
|
25
|
+
networks,
|
|
29
26
|
timeoutMs,
|
|
30
27
|
maxConcurrency,
|
|
31
28
|
maxOutputBytes,
|
|
32
|
-
|
|
33
|
-
network: networkSource,
|
|
34
|
-
hubAddress: hubSource,
|
|
35
|
-
tokenRegistryAddress: registrySource,
|
|
29
|
+
limitsSource: {
|
|
36
30
|
timeoutMs: env.OBYTE_REQUEST_TIMEOUT_MS ? "env" : cli.timeoutMs !== undefined ? "cli" : "default",
|
|
37
31
|
maxConcurrency: env.OBYTE_MAX_CONCURRENCY ? "env" : cli.maxConcurrency !== undefined ? "cli" : "default",
|
|
38
32
|
maxOutputBytes: env.OBYTE_MAX_OUTPUT_BYTES ? "env" : cli.maxOutputBytes !== undefined ? "cli" : "default"
|
|
39
33
|
}
|
|
40
34
|
};
|
|
41
35
|
}
|
|
36
|
+
/** Narrows the full runtime config to the fields the response envelope needs for one network. */
|
|
37
|
+
export function envelopeConfig(config, network) {
|
|
38
|
+
return { network, hubAddress: config.networks[network].hubAddress, maxOutputBytes: config.maxOutputBytes };
|
|
39
|
+
}
|
|
40
|
+
function buildNetworkConfig(network, env, cli, defaultNetwork) {
|
|
41
|
+
const isDefault = network === defaultNetwork;
|
|
42
|
+
const upper = network.toUpperCase();
|
|
43
|
+
const hub = resolveSourced([
|
|
44
|
+
[normalizeHubAddress(env[`OBYTE_${upper}_HUB_ADDRESS`]), "env"],
|
|
45
|
+
[normalizeHubAddress(network === "mainnet" ? cli.mainnetHubAddress : cli.testnetHubAddress), "cli"],
|
|
46
|
+
[isDefault ? normalizeHubAddress(env.OBYTE_HUB_ADDRESS) : undefined, "env"],
|
|
47
|
+
[isDefault ? normalizeHubAddress(cli.hubAddress) : undefined, "cli"]
|
|
48
|
+
], [network === "testnet" ? TESTNET_HUB : MAINNET_HUB, "default"]);
|
|
49
|
+
const registryDefault = network === "mainnet" ? MAINNET_TOKEN_REGISTRY_ADDRESS : undefined;
|
|
50
|
+
const registry = resolveSourced([
|
|
51
|
+
[normalizeOptionalString(env[`OBYTE_${upper}_TOKEN_REGISTRY_ADDRESS`]), "env"],
|
|
52
|
+
[normalizeOptionalString(network === "mainnet" ? cli.mainnetTokenRegistryAddress : cli.testnetTokenRegistryAddress), "cli"],
|
|
53
|
+
[isDefault ? normalizeOptionalString(env.OBYTE_TOKEN_REGISTRY_ADDRESS) : undefined, "env"],
|
|
54
|
+
[isDefault ? normalizeOptionalString(cli.tokenRegistryAddress) : undefined, "cli"]
|
|
55
|
+
], [registryDefault, registryDefault ? "default" : "unset"]);
|
|
56
|
+
return {
|
|
57
|
+
network,
|
|
58
|
+
hubAddress: hub.value,
|
|
59
|
+
tokenRegistryAddress: registry.value,
|
|
60
|
+
hubSource: hub.source,
|
|
61
|
+
tokenRegistrySource: registry.source
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function resolveSourced(candidates, fallback) {
|
|
65
|
+
for (const [value, source] of candidates) {
|
|
66
|
+
if (value !== undefined)
|
|
67
|
+
return { value, source };
|
|
68
|
+
}
|
|
69
|
+
return { value: fallback[0], source: fallback[1] };
|
|
70
|
+
}
|
|
42
71
|
export function normalizeHubAddress(value) {
|
|
43
72
|
const raw = normalizeOptionalString(value);
|
|
44
73
|
if (!raw)
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,kBAAkB,EAClB,WAAW,EACX,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACpB,cAAc,EACd,WAAW,EACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,UAAU,YAAY,CAAC,KAAyB,EAAE,MAAc;IACpE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7D,MAAM,IAAI,aAAa,CAAC,cAAc,EAAE,GAAG,MAAM,iCAAiC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG,EAAE,MAAkB,EAAE;IAC3F,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IACpE,MAAM,
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/configSnippets.d.ts
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
import type { ClientName } from "./cliArgs.js";
|
|
2
|
-
import type {
|
|
3
|
-
export declare
|
|
4
|
-
export
|
|
5
|
-
|
|
2
|
+
import type { RuntimeConfig } from "./types.js";
|
|
3
|
+
export declare const DEFAULT_SERVER_NAME = "obyte";
|
|
4
|
+
export interface Invocation {
|
|
5
|
+
command: string;
|
|
6
|
+
args: string[];
|
|
7
|
+
}
|
|
8
|
+
/** The `npx` arguments that launch the server with the given runtime config. */
|
|
9
|
+
export declare function commandArgs(config: RuntimeConfig): string[];
|
|
10
|
+
/** The `command`/`args` for the entry written into a JSON-style client config (`npx obyte-mcp ...`). */
|
|
11
|
+
export declare function serverEntry(config: RuntimeConfig): Invocation;
|
|
12
|
+
/** The client CLI command that registers the server (for clients that expose a CLI). */
|
|
13
|
+
export declare function installInvocation(client: ClientName, config: RuntimeConfig, serverName: string): Invocation | undefined;
|
|
14
|
+
export declare function configSnippet(client: ClientName, config: RuntimeConfig, serverName?: string): string;
|
|
15
|
+
export declare function allConfigSnippets(config: RuntimeConfig, serverName?: string): string;
|
|
16
|
+
export declare function vscodeSnippet(config: RuntimeConfig, serverName?: string): string;
|
|
17
|
+
export declare function codexSnippet(config: RuntimeConfig, serverName?: string): string;
|
|
18
|
+
export declare function claudeDesktopSnippet(config: RuntimeConfig, serverName?: string): string;
|
|
19
|
+
export declare function claudeCodeSnippet(config: RuntimeConfig, serverName?: string): string;
|
|
20
|
+
export declare function shellQuote(value: string): string;
|
package/dist/configSnippets.js
CHANGED
|
@@ -1,69 +1,118 @@
|
|
|
1
|
-
export
|
|
1
|
+
export const DEFAULT_SERVER_NAME = "obyte";
|
|
2
|
+
/** The `npx` arguments that launch the server with the given runtime config. */
|
|
3
|
+
export function commandArgs(config) {
|
|
4
|
+
const args = ["-y", "obyte-mcp"];
|
|
5
|
+
if (config.defaultNetwork !== "mainnet")
|
|
6
|
+
args.push("--network", config.defaultNetwork);
|
|
7
|
+
if (config.networks.mainnet.hubSource !== "default")
|
|
8
|
+
args.push("--mainnet-hub", config.networks.mainnet.hubAddress);
|
|
9
|
+
if (config.networks.testnet.hubSource !== "default")
|
|
10
|
+
args.push("--testnet-hub", config.networks.testnet.hubAddress);
|
|
11
|
+
if (isOverride(config.networks.mainnet.tokenRegistrySource) && config.networks.mainnet.tokenRegistryAddress) {
|
|
12
|
+
args.push("--mainnet-token-registry", config.networks.mainnet.tokenRegistryAddress);
|
|
13
|
+
}
|
|
14
|
+
if (isOverride(config.networks.testnet.tokenRegistrySource) && config.networks.testnet.tokenRegistryAddress) {
|
|
15
|
+
args.push("--testnet-token-registry", config.networks.testnet.tokenRegistryAddress);
|
|
16
|
+
}
|
|
17
|
+
return args;
|
|
18
|
+
}
|
|
19
|
+
function isOverride(source) {
|
|
20
|
+
return source === "env" || source === "cli";
|
|
21
|
+
}
|
|
22
|
+
/** The `command`/`args` for the entry written into a JSON-style client config (`npx obyte-mcp ...`). */
|
|
23
|
+
export function serverEntry(config) {
|
|
24
|
+
return { command: "npx", args: commandArgs(config) };
|
|
25
|
+
}
|
|
26
|
+
/** The client CLI command that registers the server (for clients that expose a CLI). */
|
|
27
|
+
export function installInvocation(client, config, serverName) {
|
|
28
|
+
const args = commandArgs(config);
|
|
29
|
+
if (client === "claude-code") {
|
|
30
|
+
return { command: "claude", args: ["mcp", "add", "--transport", "stdio", serverName, "--", "npx", ...args] };
|
|
31
|
+
}
|
|
32
|
+
if (client === "codex") {
|
|
33
|
+
return { command: "codex", args: ["mcp", "add", serverName, "--", "npx", ...args] };
|
|
34
|
+
}
|
|
35
|
+
if (client === "vscode") {
|
|
36
|
+
return { command: "code", args: ["--add-mcp", JSON.stringify({ name: serverName, command: "npx", args })] };
|
|
37
|
+
}
|
|
38
|
+
return undefined; // claude-desktop has no CLI; it is configured by writing its JSON file
|
|
39
|
+
}
|
|
40
|
+
export function configSnippet(client, config, serverName = DEFAULT_SERVER_NAME) {
|
|
2
41
|
if (client === "claude-code")
|
|
3
|
-
return
|
|
42
|
+
return claudeCodeSnippet(config, serverName);
|
|
4
43
|
if (client === "claude-desktop")
|
|
5
|
-
return
|
|
6
|
-
|
|
44
|
+
return claudeDesktopSnippet(config, serverName);
|
|
45
|
+
if (client === "vscode")
|
|
46
|
+
return vscodeSnippet(config, serverName);
|
|
47
|
+
return codexSnippet(config, serverName);
|
|
7
48
|
}
|
|
8
|
-
export function allConfigSnippets(config) {
|
|
9
|
-
return
|
|
49
|
+
export function allConfigSnippets(config, serverName = DEFAULT_SERVER_NAME) {
|
|
50
|
+
return `## VS Code
|
|
51
|
+
|
|
52
|
+
${vscodeSnippet(config, serverName)}
|
|
53
|
+
|
|
54
|
+
## Codex CLI
|
|
10
55
|
|
|
11
|
-
${
|
|
56
|
+
${codexSnippet(config, serverName)}
|
|
12
57
|
|
|
13
|
-
|
|
58
|
+
## Claude Desktop
|
|
14
59
|
|
|
15
|
-
${
|
|
60
|
+
${claudeDesktopSnippet(config, serverName)}
|
|
16
61
|
|
|
17
|
-
|
|
62
|
+
## Claude Code
|
|
18
63
|
|
|
19
|
-
${
|
|
64
|
+
${claudeCodeSnippet(config, serverName)}
|
|
20
65
|
`;
|
|
21
66
|
}
|
|
22
|
-
export function
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (config.source.hubAddress !== "default")
|
|
28
|
-
args.push("--hub", config.hubAddress);
|
|
29
|
-
if (config.tokenRegistryAddress && config.source.tokenRegistryAddress !== "default") {
|
|
30
|
-
args.push("--token-registry", config.tokenRegistryAddress);
|
|
31
|
-
}
|
|
32
|
-
return args;
|
|
33
|
-
}
|
|
34
|
-
function codexJson(config) {
|
|
35
|
-
return fencedJson({
|
|
36
|
-
mcpServers: {
|
|
37
|
-
obyte: {
|
|
38
|
-
command: "npx",
|
|
39
|
-
args: commandArgs(config)
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
function claudeDesktopJson(config) {
|
|
45
|
-
return fencedJson({
|
|
46
|
-
mcpServers: {
|
|
47
|
-
obyte: {
|
|
48
|
-
command: "npx",
|
|
49
|
-
args: commandArgs(config)
|
|
50
|
-
}
|
|
67
|
+
export function vscodeSnippet(config, serverName = DEFAULT_SERVER_NAME) {
|
|
68
|
+
const entry = serverEntry(config);
|
|
69
|
+
const body = fencedJson({
|
|
70
|
+
servers: {
|
|
71
|
+
[serverName]: { type: "stdio", command: entry.command, args: entry.args }
|
|
51
72
|
}
|
|
52
73
|
});
|
|
74
|
+
return `Add to \`.vscode/mcp.json\` (workspace) or your user \`settings.json\` under \`"mcp"\`:
|
|
75
|
+
|
|
76
|
+
${body}
|
|
77
|
+
|
|
78
|
+
Or register it from a terminal:
|
|
79
|
+
|
|
80
|
+
${fencedShell(`code --add-mcp '${JSON.stringify({ name: serverName, command: entry.command, args: entry.args })}'`)}`;
|
|
53
81
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
|
|
82
|
+
export function codexSnippet(config, serverName = DEFAULT_SERVER_NAME) {
|
|
83
|
+
const entry = serverEntry(config);
|
|
84
|
+
const argsToml = entry.args.map((value) => JSON.stringify(value)).join(", ");
|
|
85
|
+
return `Add to \`~/.codex/config.toml\`:
|
|
86
|
+
|
|
87
|
+
\`\`\`toml
|
|
88
|
+
[mcp_servers.${serverName}]
|
|
89
|
+
command = ${JSON.stringify(entry.command)}
|
|
90
|
+
args = [${argsToml}]
|
|
57
91
|
\`\`\`
|
|
58
92
|
|
|
59
|
-
|
|
93
|
+
Or register it from a terminal (newer Codex CLI):
|
|
94
|
+
|
|
95
|
+
${fencedShell(`codex mcp add ${serverName} -- ${entry.command} ${entry.args.map(shellQuote).join(" ")}`)}`;
|
|
96
|
+
}
|
|
97
|
+
export function claudeDesktopSnippet(config, serverName = DEFAULT_SERVER_NAME) {
|
|
98
|
+
const entry = serverEntry(config);
|
|
99
|
+
return `Edit \`claude_desktop_config.json\` and restart Claude Desktop:
|
|
100
|
+
|
|
101
|
+
${fencedJson({ mcpServers: { [serverName]: { command: entry.command, args: entry.args } } })}`;
|
|
102
|
+
}
|
|
103
|
+
export function claudeCodeSnippet(config, serverName = DEFAULT_SERVER_NAME) {
|
|
104
|
+
const entry = serverEntry(config);
|
|
105
|
+
return `${fencedShell(`claude mcp add --transport stdio ${serverName} -- ${entry.command} ${entry.args.map(shellQuote).join(" ")}`)}
|
|
106
|
+
|
|
107
|
+
The \`--\` before \`${entry.command}\` is required. Without it, Claude Code can parse server flags as Claude flags.`;
|
|
60
108
|
}
|
|
61
109
|
function fencedJson(value) {
|
|
62
|
-
return `\`\`\`json
|
|
63
|
-
|
|
64
|
-
|
|
110
|
+
return `\`\`\`json\n${JSON.stringify(value, null, 2)}\n\`\`\``;
|
|
111
|
+
}
|
|
112
|
+
function fencedShell(command) {
|
|
113
|
+
return `\`\`\`bash\n${command}\n\`\`\``;
|
|
65
114
|
}
|
|
66
|
-
function shellQuote(value) {
|
|
115
|
+
export function shellQuote(value) {
|
|
67
116
|
if (/^[A-Za-z0-9._/:=-]+$/.test(value))
|
|
68
117
|
return value;
|
|
69
118
|
return `'${value.replace(/'/g, "'\\''")}'`;
|