chia-explorer 0.1.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.
Files changed (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -0
  3. package/dist/chia/amounts.d.ts +11 -0
  4. package/dist/chia/amounts.js +52 -0
  5. package/dist/chia/amounts.js.map +1 -0
  6. package/dist/chia/bech32.d.ts +8 -0
  7. package/dist/chia/bech32.js +31 -0
  8. package/dist/chia/bech32.js.map +1 -0
  9. package/dist/chia/coin-name.d.ts +15 -0
  10. package/dist/chia/coin-name.js +40 -0
  11. package/dist/chia/coin-name.js.map +1 -0
  12. package/dist/chia/hex.d.ts +4 -0
  13. package/dist/chia/hex.js +26 -0
  14. package/dist/chia/hex.js.map +1 -0
  15. package/dist/coinset/agent.d.ts +7 -0
  16. package/dist/coinset/agent.js +26 -0
  17. package/dist/coinset/agent.js.map +1 -0
  18. package/dist/coinset/pagination.d.ts +24 -0
  19. package/dist/coinset/pagination.js +42 -0
  20. package/dist/coinset/pagination.js.map +1 -0
  21. package/dist/index.d.ts +2 -0
  22. package/dist/index.js +12 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/network.d.ts +6 -0
  25. package/dist/network.js +18 -0
  26. package/dist/network.js.map +1 -0
  27. package/dist/prompts/address-summary.d.ts +2 -0
  28. package/dist/prompts/address-summary.js +34 -0
  29. package/dist/prompts/address-summary.js.map +1 -0
  30. package/dist/prompts/block-summary.d.ts +2 -0
  31. package/dist/prompts/block-summary.js +50 -0
  32. package/dist/prompts/block-summary.js.map +1 -0
  33. package/dist/prompts/network-status.d.ts +2 -0
  34. package/dist/prompts/network-status.js +29 -0
  35. package/dist/prompts/network-status.js.map +1 -0
  36. package/dist/schemas/common.d.ts +7 -0
  37. package/dist/schemas/common.js +24 -0
  38. package/dist/schemas/common.js.map +1 -0
  39. package/dist/server.d.ts +2 -0
  40. package/dist/server.js +42 -0
  41. package/dist/server.js.map +1 -0
  42. package/dist/tools/addresses/address-to-puzzle-hash.d.ts +2 -0
  43. package/dist/tools/addresses/address-to-puzzle-hash.js +21 -0
  44. package/dist/tools/addresses/address-to-puzzle-hash.js.map +1 -0
  45. package/dist/tools/addresses/puzzle-hash-to-address.d.ts +2 -0
  46. package/dist/tools/addresses/puzzle-hash-to-address.js +24 -0
  47. package/dist/tools/addresses/puzzle-hash-to-address.js.map +1 -0
  48. package/dist/tools/blockchain/count-block-transactions.d.ts +2 -0
  49. package/dist/tools/blockchain/count-block-transactions.js +52 -0
  50. package/dist/tools/blockchain/count-block-transactions.js.map +1 -0
  51. package/dist/tools/blockchain/get-block-by-hash.d.ts +2 -0
  52. package/dist/tools/blockchain/get-block-by-hash.js +27 -0
  53. package/dist/tools/blockchain/get-block-by-hash.js.map +1 -0
  54. package/dist/tools/blockchain/get-block-by-height.d.ts +2 -0
  55. package/dist/tools/blockchain/get-block-by-height.js +28 -0
  56. package/dist/tools/blockchain/get-block-by-height.js.map +1 -0
  57. package/dist/tools/blockchain/get-blockchain-state.d.ts +2 -0
  58. package/dist/tools/blockchain/get-blockchain-state.js +37 -0
  59. package/dist/tools/blockchain/get-blockchain-state.js.map +1 -0
  60. package/dist/tools/blockchain/get-netspace.d.ts +2 -0
  61. package/dist/tools/blockchain/get-netspace.js +26 -0
  62. package/dist/tools/blockchain/get-netspace.js.map +1 -0
  63. package/dist/tools/blockchain/get-peak-height.d.ts +2 -0
  64. package/dist/tools/blockchain/get-peak-height.js +23 -0
  65. package/dist/tools/blockchain/get-peak-height.js.map +1 -0
  66. package/dist/tools/coins/calculate-coin-name.d.ts +2 -0
  67. package/dist/tools/coins/calculate-coin-name.js +28 -0
  68. package/dist/tools/coins/calculate-coin-name.js.map +1 -0
  69. package/dist/tools/coins/get-balance.d.ts +2 -0
  70. package/dist/tools/coins/get-balance.js +35 -0
  71. package/dist/tools/coins/get-balance.js.map +1 -0
  72. package/dist/tools/coins/get-coin-by-name.d.ts +2 -0
  73. package/dist/tools/coins/get-coin-by-name.js +34 -0
  74. package/dist/tools/coins/get-coin-by-name.js.map +1 -0
  75. package/dist/tools/coins/get-coin-records-by-puzzle-hash.d.ts +2 -0
  76. package/dist/tools/coins/get-coin-records-by-puzzle-hash.js +36 -0
  77. package/dist/tools/coins/get-coin-records-by-puzzle-hash.js.map +1 -0
  78. package/dist/tools/shared/address-input.d.ts +12 -0
  79. package/dist/tools/shared/address-input.js +26 -0
  80. package/dist/tools/shared/address-input.js.map +1 -0
  81. package/dist/tools/shared/response.d.ts +3 -0
  82. package/dist/tools/shared/response.js +16 -0
  83. package/dist/tools/shared/response.js.map +1 -0
  84. package/dist/version.d.ts +1 -0
  85. package/dist/version.js +7 -0
  86. package/dist/version.js.map +1 -0
  87. package/package.json +75 -0
@@ -0,0 +1,7 @@
1
+ import { z } from 'zod';
2
+ export declare const networkSchema: z.ZodDefault<z.ZodEnum<[string, ...string[]]>>;
3
+ export declare const networkSchemaOptional: z.ZodOptional<z.ZodEnum<[string, ...string[]]>>;
4
+ export declare const hex32Schema: z.ZodString;
5
+ export declare const addressSchema: z.ZodString;
6
+ export declare const addressOrPuzzleHashSchema: z.ZodString;
7
+ export declare const heightSchema: z.ZodNumber;
@@ -0,0 +1,24 @@
1
+ import { z } from 'zod';
2
+ import { DEFAULT_NETWORK, NETWORKS } from '../network.js';
3
+ export const networkSchema = z
4
+ .enum(NETWORKS)
5
+ .default(DEFAULT_NETWORK)
6
+ .describe("Chia network: 'mainnet' (default) or 'testnet11'");
7
+ export const networkSchemaOptional = z
8
+ .enum(NETWORKS)
9
+ .optional()
10
+ .describe("Chia network: 'mainnet' or 'testnet11'. Optional — auto-detected from address prefix when an address is supplied.");
11
+ const HEX32_REGEX = /^(0x)?[0-9a-fA-F]{64}$/;
12
+ const ADDRESS_REGEX = /^(xch|txch)1[02-9ac-hj-np-z]{6,}$/i;
13
+ export const hex32Schema = z
14
+ .string()
15
+ .regex(HEX32_REGEX, '32-byte hex string (64 hex chars, optional 0x prefix)');
16
+ export const addressSchema = z
17
+ .string()
18
+ .regex(ADDRESS_REGEX, "bech32m address starting with 'xch1' or 'txch1'");
19
+ export const addressOrPuzzleHashSchema = z
20
+ .string()
21
+ .min(1)
22
+ .describe('An xch/txch bech32m address OR a 32-byte hex puzzle hash (optional 0x prefix)');
23
+ export const heightSchema = z.number().int().nonnegative().describe('Block height');
24
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/schemas/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,IAAI,CAAC,QAA4C,CAAC;KAClD,OAAO,CAAC,eAAe,CAAC;KACxB,QAAQ,CAAC,kDAAkD,CAAC,CAAC;AAEhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC;KACnC,IAAI,CAAC,QAA4C,CAAC;KAClD,QAAQ,EAAE;KACV,QAAQ,CACP,mHAAmH,CACpH,CAAC;AAEJ,MAAM,WAAW,GAAG,wBAAwB,CAAC;AAC7C,MAAM,aAAa,GAAG,oCAAoC,CAAC;AAE3D,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC;KACzB,MAAM,EAAE;KACR,KAAK,CAAC,WAAW,EAAE,uDAAuD,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,EAAE;KACR,KAAK,CAAC,aAAa,EAAE,iDAAiD,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,QAAQ,CAAC,+EAA+E,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function createServer(): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,42 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { VERSION } from './version.js';
3
+ import { register as registerGetBlockchainState } from './tools/blockchain/get-blockchain-state.js';
4
+ import { register as registerGetNetspace } from './tools/blockchain/get-netspace.js';
5
+ import { register as registerGetPeakHeight } from './tools/blockchain/get-peak-height.js';
6
+ import { register as registerGetBlockByHeight } from './tools/blockchain/get-block-by-height.js';
7
+ import { register as registerGetBlockByHash } from './tools/blockchain/get-block-by-hash.js';
8
+ import { register as registerCountBlockTransactions } from './tools/blockchain/count-block-transactions.js';
9
+ import { register as registerGetBalance } from './tools/coins/get-balance.js';
10
+ import { register as registerGetCoinRecordsByPuzzleHash } from './tools/coins/get-coin-records-by-puzzle-hash.js';
11
+ import { register as registerGetCoinByName } from './tools/coins/get-coin-by-name.js';
12
+ import { register as registerCalculateCoinName } from './tools/coins/calculate-coin-name.js';
13
+ import { register as registerAddressToPuzzleHash } from './tools/addresses/address-to-puzzle-hash.js';
14
+ import { register as registerPuzzleHashToAddress } from './tools/addresses/puzzle-hash-to-address.js';
15
+ import { register as registerNetworkStatusPrompt } from './prompts/network-status.js';
16
+ import { register as registerAddressSummaryPrompt } from './prompts/address-summary.js';
17
+ import { register as registerBlockSummaryPrompt } from './prompts/block-summary.js';
18
+ export function createServer() {
19
+ const server = new McpServer({ name: 'chia-explorer', version: VERSION }, {
20
+ instructions: 'chia-explorer answers questions about the Chia blockchain via the public coinset.org API. ' +
21
+ 'Read-only: no signing, no key material, no push_tx. ' +
22
+ "All tools accept an optional `network: 'mainnet' | 'testnet11'` argument; mainnet is the default. " +
23
+ 'When an address is provided, the network is auto-detected from the prefix (xch / txch).',
24
+ });
25
+ registerGetBlockchainState(server);
26
+ registerGetNetspace(server);
27
+ registerGetPeakHeight(server);
28
+ registerGetBlockByHeight(server);
29
+ registerGetBlockByHash(server);
30
+ registerCountBlockTransactions(server);
31
+ registerGetBalance(server);
32
+ registerGetCoinRecordsByPuzzleHash(server);
33
+ registerGetCoinByName(server);
34
+ registerCalculateCoinName(server);
35
+ registerAddressToPuzzleHash(server);
36
+ registerPuzzleHashToAddress(server);
37
+ registerNetworkStatusPrompt(server);
38
+ registerAddressSummaryPrompt(server);
39
+ registerBlockSummaryPrompt(server);
40
+ return server;
41
+ }
42
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AACpG,OAAO,EAAE,QAAQ,IAAI,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACrF,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC1F,OAAO,EAAE,QAAQ,IAAI,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AACjG,OAAO,EAAE,QAAQ,IAAI,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AAC7F,OAAO,EAAE,QAAQ,IAAI,8BAA8B,EAAE,MAAM,gDAAgD,CAAC;AAE5G,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,QAAQ,IAAI,kCAAkC,EAAE,MAAM,kDAAkD,CAAC;AAClH,OAAO,EAAE,QAAQ,IAAI,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AACtF,OAAO,EAAE,QAAQ,IAAI,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAE7F,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AACtG,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAEtG,OAAO,EAAE,QAAQ,IAAI,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AACtF,OAAO,EAAE,QAAQ,IAAI,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,QAAQ,IAAI,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAEpF,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,EAC3C;QACE,YAAY,EACV,4FAA4F;YAC5F,sDAAsD;YACtD,oGAAoG;YACpG,yFAAyF;KAC5F,CACF,CAAC;IAEF,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,wBAAwB,CAAC,MAAM,CAAC,CAAC;IACjC,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAEvC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC3C,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IAEpC,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACpC,4BAA4B,CAAC,MAAM,CAAC,CAAC;IACrC,0BAA0B,CAAC,MAAM,CAAC,CAAC;IAEnC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,21 @@
1
+ import { addressSchema } from '../../schemas/common.js';
2
+ import { addressToPuzzleHash } from '../../chia/bech32.js';
3
+ import { errorText, jsonText } from '../shared/response.js';
4
+ export function register(server) {
5
+ server.tool('address_to_puzzle_hash', 'Decode an xch1/txch1 bech32m address to its 32-byte puzzle hash. Also reports the detected network. Local computation only — no RPC.', {
6
+ address: addressSchema,
7
+ }, async ({ address }) => {
8
+ try {
9
+ const { puzzleHash, network } = addressToPuzzleHash(address.trim());
10
+ return jsonText({
11
+ address: address.trim().toLowerCase(),
12
+ puzzle_hash: puzzleHash,
13
+ network,
14
+ });
15
+ }
16
+ catch (err) {
17
+ return errorText(err);
18
+ }
19
+ });
20
+ }
21
+ //# sourceMappingURL=address-to-puzzle-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"address-to-puzzle-hash.js","sourceRoot":"","sources":["../../../src/tools/addresses/address-to-puzzle-hash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,sIAAsI,EACtI;QACE,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;gBACrC,WAAW,EAAE,UAAU;gBACvB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,24 @@
1
+ import { hex32Schema, networkSchema } from '../../schemas/common.js';
2
+ import { puzzleHashToAddress } from '../../chia/bech32.js';
3
+ import { stripHexPrefix } from '../../chia/hex.js';
4
+ import { errorText, jsonText } from '../shared/response.js';
5
+ export function register(server) {
6
+ server.tool('puzzle_hash_to_address', 'Encode a 32-byte puzzle hash to a bech32m xch/txch address. Use `network` to select mainnet (xch) or testnet11 (txch). Local computation only — no RPC.', {
7
+ puzzle_hash: hex32Schema,
8
+ network: networkSchema,
9
+ }, async ({ puzzle_hash, network }) => {
10
+ try {
11
+ const ph = stripHexPrefix(puzzle_hash).toLowerCase();
12
+ const address = puzzleHashToAddress(ph, network);
13
+ return jsonText({
14
+ puzzle_hash: ph,
15
+ network,
16
+ address,
17
+ });
18
+ }
19
+ catch (err) {
20
+ return errorText(err);
21
+ }
22
+ });
23
+ }
24
+ //# sourceMappingURL=puzzle-hash-to-address.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"puzzle-hash-to-address.js","sourceRoot":"","sources":["../../../src/tools/addresses/puzzle-hash-to-address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,yJAAyJ,EACzJ;QACE,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,EAAE,OAAkB,CAAC,CAAC;YAC5D,OAAO,QAAQ,CAAC;gBACd,WAAW,EAAE,EAAE;gBACf,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,52 @@
1
+ import { z } from 'zod';
2
+ import { get_additions_and_removals, get_block_record_by_height, get_block_spends, } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { hex32Schema, heightSchema, networkSchema } from '../../schemas/common.js';
5
+ import { stripHexPrefix } from '../../chia/hex.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('count_block_transactions', "Count the 'transactions' in a Chia block. Returns coin_spends_count (the canonical analogue), plus additions_count and removals_count. Pass either height OR header_hash.", {
9
+ height: heightSchema.optional(),
10
+ header_hash: hex32Schema.optional(),
11
+ network: networkSchema,
12
+ }, async ({ height, header_hash, network }) => {
13
+ try {
14
+ if (height === undefined && header_hash === undefined) {
15
+ throw new Error('provide either height or header_hash');
16
+ }
17
+ const agent = getAgent(network);
18
+ let resolvedHash;
19
+ let resolvedHeight = null;
20
+ let isTransactionBlock = true;
21
+ if (header_hash !== undefined) {
22
+ resolvedHash = stripHexPrefix(header_hash).toLowerCase();
23
+ }
24
+ else {
25
+ const rec = await get_block_record_by_height(agent, { height: height });
26
+ if (!rec.block_record)
27
+ throw new Error(`no block record at height ${height}`);
28
+ resolvedHash = rec.block_record.header_hash;
29
+ resolvedHeight = rec.block_record.height;
30
+ isTransactionBlock = rec.block_record.timestamp != null;
31
+ }
32
+ const [spendsRes, addRemRes] = await Promise.all([
33
+ get_block_spends(agent, { header_hash: resolvedHash }),
34
+ get_additions_and_removals(agent, { header_hash: resolvedHash }),
35
+ ]);
36
+ return jsonText({
37
+ network,
38
+ height: resolvedHeight,
39
+ header_hash: resolvedHash,
40
+ is_transaction_block: isTransactionBlock,
41
+ coin_spends_count: spendsRes.block_spends?.length ?? 0,
42
+ additions_count: addRemRes.additions?.length ?? 0,
43
+ removals_count: addRemRes.removals?.length ?? 0,
44
+ });
45
+ }
46
+ catch (err) {
47
+ return errorText(err);
48
+ }
49
+ });
50
+ }
51
+ void z;
52
+ //# sourceMappingURL=count-block-transactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"count-block-transactions.js","sourceRoot":"","sources":["../../../src/tools/blockchain/count-block-transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAC1B,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,0BAA0B,EAC1B,2KAA2K,EAC3K;QACE,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE;QAC/B,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE;QACnC,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBACtD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAC1D,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,IAAI,YAAoB,CAAC;YACzB,IAAI,cAAc,GAAkB,IAAI,CAAC;YACzC,IAAI,kBAAkB,GAAG,IAAI,CAAC;YAC9B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,MAAgB,EAAE,CAAC,CAAC;gBAClF,IAAI,CAAC,GAAG,CAAC,YAAY;oBAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAO,EAAE,CAAC,CAAC;gBAC/E,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC,WAAW,CAAC;gBAC5C,cAAc,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC;gBACzC,kBAAkB,GAAG,GAAG,CAAC,YAAY,CAAC,SAAS,IAAI,IAAI,CAAC;YAC1D,CAAC;YAED,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC/C,gBAAgB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;gBACtD,0BAA0B,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;aACjE,CAAC,CAAC;YAEH,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,MAAM,EAAE,cAAc;gBACtB,WAAW,EAAE,YAAY;gBACzB,oBAAoB,EAAE,kBAAkB;gBACxC,iBAAiB,EAAE,SAAS,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC;gBACtD,eAAe,EAAE,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;gBACjD,cAAc,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;aAChD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,27 @@
1
+ import { get_block_record } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { hex32Schema, networkSchema } from '../../schemas/common.js';
4
+ import { stripHexPrefix } from '../../chia/hex.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('get_block_by_hash', 'Get the block record for a given header hash (32-byte hex, optional 0x prefix).', {
8
+ header_hash: hex32Schema,
9
+ network: networkSchema,
10
+ }, async ({ header_hash, network }) => {
11
+ try {
12
+ const agent = getAgent(network);
13
+ const normalized = stripHexPrefix(header_hash).toLowerCase();
14
+ const res = await get_block_record(agent, { header_hash: normalized });
15
+ return jsonText({
16
+ network,
17
+ header_hash: normalized,
18
+ block_record: res.block_record,
19
+ height: res.block_record?.height ?? null,
20
+ });
21
+ }
22
+ catch (err) {
23
+ return errorText(err);
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=get-block-by-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block-by-hash.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-block-by-hash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,iFAAiF,EACjF;QACE,WAAW,EAAE,WAAW;QACxB,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,WAAW,EAAE,UAAU;gBACvB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,GAAG,CAAC,YAAY,EAAE,MAAM,IAAI,IAAI;aACzC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { get_block_record_by_height } from 'chia-agent/api/rpc/full_node/index.js';
3
+ import { getAgent } from '../../coinset/agent.js';
4
+ import { heightSchema, networkSchema } from '../../schemas/common.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('get_block_by_height', 'Get the block record (including header hash, timestamp and previous hash) for a block at the given height.', {
8
+ height: heightSchema,
9
+ network: networkSchema,
10
+ }, async ({ height, network }) => {
11
+ try {
12
+ const agent = getAgent(network);
13
+ const res = await get_block_record_by_height(agent, { height });
14
+ return jsonText({
15
+ network,
16
+ height,
17
+ block_record: res.block_record,
18
+ header_hash: res.block_record?.header_hash ?? null,
19
+ });
20
+ }
21
+ catch (err) {
22
+ return errorText(err);
23
+ }
24
+ });
25
+ }
26
+ // Silence unused-import warning in some configurations.
27
+ void z;
28
+ //# sourceMappingURL=get-block-by-height.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block-by-height.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-block-by-height.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,4GAA4G,EAC5G;QACE,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,MAAM;gBACN,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,WAAW,EAAE,GAAG,CAAC,YAAY,EAAE,WAAW,IAAI,IAAI;aACnD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,KAAK,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,37 @@
1
+ import { get_blockchain_state } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { formatNetspace } from '../../chia/amounts.js';
4
+ import { networkSchema } from '../../schemas/common.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('get_blockchain_state', 'Get the current Chia blockchain state: peak height, netspace (raw + formatted EiB/PiB), difficulty, mempool stats and sync status. Defaults to mainnet.', { network: networkSchema }, async ({ network }) => {
8
+ try {
9
+ const agent = getAgent(network);
10
+ const res = await get_blockchain_state(agent);
11
+ const bs = res.blockchain_state;
12
+ const space = formatNetspace(bs.space);
13
+ return jsonText({
14
+ network,
15
+ peak_height: bs.peak?.height ?? null,
16
+ peak_header_hash: bs.peak?.header_hash ?? null,
17
+ peak_timestamp: bs.peak?.timestamp ?? null,
18
+ space_bytes: space.bytes,
19
+ space_eib: space.eib,
20
+ space_pib: space.pib,
21
+ space_human: space.human,
22
+ difficulty: bs.difficulty,
23
+ sub_slot_iters: bs.sub_slot_iters,
24
+ average_block_time_seconds: bs.average_block_time ?? null,
25
+ mempool_size: bs.mempool_size,
26
+ mempool_cost: bs.mempool_cost,
27
+ mempool_min_fees: bs.mempool_min_fees,
28
+ sync: bs.sync,
29
+ node_id: bs.node_id,
30
+ });
31
+ }
32
+ catch (err) {
33
+ return errorText(err);
34
+ }
35
+ });
36
+ }
37
+ //# sourceMappingURL=get-blockchain-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-blockchain-state.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-blockchain-state.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,yJAAyJ,EACzJ,EAAE,OAAO,EAAE,aAAa,EAAE,EAC1B,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,GAAG,GAAG,CAAC,gBAAgB,CAAC;YAChC,MAAM,KAAK,GAAG,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,WAAW,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI;gBACpC,gBAAgB,EAAE,EAAE,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI;gBAC9C,cAAc,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,IAAI,IAAI;gBAC1C,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,SAAS,EAAE,KAAK,CAAC,GAAG;gBACpB,SAAS,EAAE,KAAK,CAAC,GAAG;gBACpB,WAAW,EAAE,KAAK,CAAC,KAAK;gBACxB,UAAU,EAAE,EAAE,CAAC,UAAU;gBACzB,cAAc,EAAE,EAAE,CAAC,cAAc;gBACjC,0BAA0B,EAAE,EAAE,CAAC,kBAAkB,IAAI,IAAI;gBACzD,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,YAAY,EAAE,EAAE,CAAC,YAAY;gBAC7B,gBAAgB,EAAE,EAAE,CAAC,gBAAgB;gBACrC,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,OAAO,EAAE,EAAE,CAAC,OAAO;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,26 @@
1
+ import { get_blockchain_state } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { formatNetspace } from '../../chia/amounts.js';
4
+ import { networkSchema } from '../../schemas/common.js';
5
+ import { errorText, jsonText } from '../shared/response.js';
6
+ export function register(server) {
7
+ server.tool('get_netspace', 'Get the current Chia netspace (estimated total network space). Returns raw bytes and formatted values in EiB, PiB, and TiB.', { network: networkSchema }, async ({ network }) => {
8
+ try {
9
+ const agent = getAgent(network);
10
+ const res = await get_blockchain_state(agent);
11
+ const space = formatNetspace(res.blockchain_state.space);
12
+ return jsonText({
13
+ network,
14
+ bytes: space.bytes,
15
+ eib: space.eib,
16
+ pib: space.pib,
17
+ tib: space.tib,
18
+ human: space.human,
19
+ });
20
+ }
21
+ catch (err) {
22
+ return errorText(err);
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=get-netspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-netspace.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-netspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,cAAc,EACd,6HAA6H,EAC7H,EAAE,OAAO,EAAE,aAAa,EAAE,EAC1B,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,23 @@
1
+ import { get_blockchain_state } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { networkSchema } from '../../schemas/common.js';
4
+ import { errorText, jsonText } from '../shared/response.js';
5
+ export function register(server) {
6
+ server.tool('get_peak_height', 'Get the current peak block height of the Chia blockchain.', { network: networkSchema }, async ({ network }) => {
7
+ try {
8
+ const agent = getAgent(network);
9
+ const res = await get_blockchain_state(agent);
10
+ const peak = res.blockchain_state.peak;
11
+ return jsonText({
12
+ network,
13
+ peak_height: peak?.height ?? null,
14
+ peak_header_hash: peak?.header_hash ?? null,
15
+ peak_timestamp: peak?.timestamp ?? null,
16
+ });
17
+ }
18
+ catch (err) {
19
+ return errorText(err);
20
+ }
21
+ });
22
+ }
23
+ //# sourceMappingURL=get-peak-height.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-peak-height.js","sourceRoot":"","sources":["../../../src/tools/blockchain/get-peak-height.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,2DAA2D,EAC3D,EAAE,OAAO,EAAE,aAAa,EAAE,EAC1B,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACvC,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,WAAW,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI;gBACjC,gBAAgB,EAAE,IAAI,EAAE,WAAW,IAAI,IAAI;gBAC3C,cAAc,EAAE,IAAI,EAAE,SAAS,IAAI,IAAI;aACxC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,28 @@
1
+ import { z } from 'zod';
2
+ import { coinName } from '../../chia/coin-name.js';
3
+ import { hex32Schema } from '../../schemas/common.js';
4
+ import { errorText, jsonText } from '../shared/response.js';
5
+ const amountSchema = z
6
+ .union([z.string(), z.number().int().nonnegative()])
7
+ .describe('Coin amount in mojos. Strings are accepted for values that exceed JS number precision.');
8
+ export function register(server) {
9
+ server.tool('calculate_coin_name', 'Compute the coin name (sha256 of parent_coin_info || puzzle_hash || amount). Local computation only — no RPC.', {
10
+ parent_coin_info: hex32Schema.describe('32-byte parent coin id (hex)'),
11
+ puzzle_hash: hex32Schema.describe('32-byte puzzle hash (hex)'),
12
+ amount: amountSchema,
13
+ }, async ({ parent_coin_info, puzzle_hash, amount }) => {
14
+ try {
15
+ const name = coinName({ parent_coin_info, puzzle_hash, amount });
16
+ return jsonText({
17
+ coin_name: name,
18
+ parent_coin_info: parent_coin_info.toLowerCase().replace(/^0x/, ''),
19
+ puzzle_hash: puzzle_hash.toLowerCase().replace(/^0x/, ''),
20
+ amount: amount.toString(),
21
+ });
22
+ }
23
+ catch (err) {
24
+ return errorText(err);
25
+ }
26
+ });
27
+ }
28
+ //# sourceMappingURL=calculate-coin-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-coin-name.js","sourceRoot":"","sources":["../../../src/tools/coins/calculate-coin-name.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,YAAY,GAAG,CAAC;KACnB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;KACnD,QAAQ,CACP,wFAAwF,CACzF,CAAC;AAEJ,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,qBAAqB,EACrB,+GAA+G,EAC/G;QACE,gBAAgB,EAAE,WAAW,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACtE,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,2BAA2B,CAAC;QAC9D,MAAM,EAAE,YAAY;KACrB,EACD,KAAK,EAAE,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,OAAO,QAAQ,CAAC;gBACd,SAAS,EAAE,IAAI;gBACf,gBAAgB,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;gBACnE,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;gBACzD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,35 @@
1
+ import { getAgent } from '../../coinset/agent.js';
2
+ import { fetchCoinRecordsByPuzzleHash } from '../../coinset/pagination.js';
3
+ import { mojoToXch, toBigInt } from '../../chia/amounts.js';
4
+ import { addressOrPuzzleHashSchema, networkSchemaOptional } from '../../schemas/common.js';
5
+ import { resolveAddressOrPuzzleHash } from '../shared/address-input.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_balance', 'Get the XCH balance of an address or puzzle hash. Sums all unspent coins (paginated). Accepts xch/txch addresses (network auto-detected from prefix) or a 32-byte hex puzzle hash (network defaults to mainnet, override with `network`).', {
9
+ address_or_puzzle_hash: addressOrPuzzleHashSchema,
10
+ network: networkSchemaOptional,
11
+ }, async ({ address_or_puzzle_hash, network }) => {
12
+ try {
13
+ const target = resolveAddressOrPuzzleHash(address_or_puzzle_hash, network);
14
+ const agent = getAgent(target.network);
15
+ const records = await fetchCoinRecordsByPuzzleHash(agent, target.puzzleHash, {
16
+ includeSpent: false,
17
+ });
18
+ let total = 0n;
19
+ for (const r of records)
20
+ total += toBigInt(r.coin.amount);
21
+ return jsonText({
22
+ network: target.network,
23
+ address: target.address,
24
+ puzzle_hash: target.puzzleHash,
25
+ unspent_coin_count: records.length,
26
+ balance_mojo: total.toString(),
27
+ balance_xch: mojoToXch(total),
28
+ });
29
+ }
30
+ catch (err) {
31
+ return errorText(err);
32
+ }
33
+ });
34
+ }
35
+ //# sourceMappingURL=get-balance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-balance.js","sourceRoot":"","sources":["../../../src/tools/coins/get-balance.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,aAAa,EACb,2OAA2O,EAC3O;QACE,sBAAsB,EAAE,yBAAyB;QACjD,OAAO,EAAE,qBAAqB;KAC/B,EACD,KAAK,EAAE,EAAE,sBAAsB,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,0BAA0B,CACvC,sBAAsB,EACtB,OAA8B,CAC/B,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE;gBAC3E,YAAY,EAAE,KAAK;aACpB,CAAC,CAAC;YACH,IAAI,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,kBAAkB,EAAE,OAAO,CAAC,MAAM;gBAClC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE;gBAC9B,WAAW,EAAE,SAAS,CAAC,KAAK,CAAC;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,34 @@
1
+ import { get_coin_record_by_name } from 'chia-agent/api/rpc/full_node/index.js';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { hex32Schema, networkSchema } from '../../schemas/common.js';
4
+ import { stripHexPrefix } from '../../chia/hex.js';
5
+ import { mojoToXch, toBigInt } from '../../chia/amounts.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_coin_by_name', 'Look up a coin record by its coin name (the 32-byte sha256 of parent_coin_info || puzzle_hash || amount).', {
9
+ name: hex32Schema,
10
+ network: networkSchema,
11
+ }, async ({ name, network }) => {
12
+ try {
13
+ const agent = getAgent(network);
14
+ const normalized = stripHexPrefix(name).toLowerCase();
15
+ const res = await get_coin_record_by_name(agent, { name: normalized });
16
+ const record = res.coin_record;
17
+ return jsonText({
18
+ network,
19
+ coin_name: normalized,
20
+ coin_record: record,
21
+ ...(record
22
+ ? {
23
+ amount_mojo: record.coin.amount.toString(),
24
+ amount_xch: mojoToXch(toBigInt(record.coin.amount)),
25
+ }
26
+ : {}),
27
+ });
28
+ }
29
+ catch (err) {
30
+ return errorText(err);
31
+ }
32
+ });
33
+ }
34
+ //# sourceMappingURL=get-coin-by-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-coin-by-name.js","sourceRoot":"","sources":["../../../src/tools/coins/get-coin-by-name.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2GAA2G,EAC3G;QACE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,aAAa;KACvB,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAkB,CAAC,CAAC;YAC3C,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,CAAC;YAC/B,OAAO,QAAQ,CAAC;gBACd,OAAO;gBACP,SAAS,EAAE,UAAU;gBACrB,WAAW,EAAE,MAAM;gBACnB,GAAG,CAAC,MAAM;oBACR,CAAC,CAAC;wBACE,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;wBAC1C,UAAU,EAAE,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;qBACpD;oBACH,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function register(server: McpServer): void;
@@ -0,0 +1,36 @@
1
+ import { z } from 'zod';
2
+ import { getAgent } from '../../coinset/agent.js';
3
+ import { fetchCoinRecordsByPuzzleHash } from '../../coinset/pagination.js';
4
+ import { addressOrPuzzleHashSchema, networkSchemaOptional } from '../../schemas/common.js';
5
+ import { resolveAddressOrPuzzleHash } from '../shared/address-input.js';
6
+ import { errorText, jsonText } from '../shared/response.js';
7
+ export function register(server) {
8
+ server.tool('get_coin_records_by_puzzle_hash', 'Return raw coin records for an address or puzzle hash. Optionally include spent coins or restrict to a height window.', {
9
+ address_or_puzzle_hash: addressOrPuzzleHashSchema,
10
+ include_spent_coins: z.boolean().optional().describe('Include spent coins (default false)'),
11
+ start_height: z.number().int().nonnegative().optional(),
12
+ end_height: z.number().int().nonnegative().optional(),
13
+ network: networkSchemaOptional,
14
+ }, async ({ address_or_puzzle_hash, include_spent_coins, start_height, end_height, network }) => {
15
+ try {
16
+ const target = resolveAddressOrPuzzleHash(address_or_puzzle_hash, network);
17
+ const agent = getAgent(target.network);
18
+ const records = await fetchCoinRecordsByPuzzleHash(agent, target.puzzleHash, {
19
+ includeSpent: include_spent_coins ?? false,
20
+ ...(start_height !== undefined ? { startHeight: start_height } : {}),
21
+ ...(end_height !== undefined ? { endHeight: end_height } : {}),
22
+ });
23
+ return jsonText({
24
+ network: target.network,
25
+ address: target.address,
26
+ puzzle_hash: target.puzzleHash,
27
+ coin_count: records.length,
28
+ coin_records: records,
29
+ });
30
+ }
31
+ catch (err) {
32
+ return errorText(err);
33
+ }
34
+ });
35
+ }
36
+ //# sourceMappingURL=get-coin-records-by-puzzle-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-coin-records-by-puzzle-hash.js","sourceRoot":"","sources":["../../../src/tools/coins/get-coin-records-by-puzzle-hash.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAE3F,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,QAAQ,CAAC,MAAiB;IACxC,MAAM,CAAC,IAAI,CACT,iCAAiC,EACjC,uHAAuH,EACvH;QACE,sBAAsB,EAAE,yBAAyB;QACjD,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;QAC3F,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACvD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;QACrD,OAAO,EAAE,qBAAqB;KAC/B,EACD,KAAK,EAAE,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,YAAY,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3F,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,0BAA0B,CACvC,sBAAsB,EACtB,OAA8B,CAC/B,CAAC;YACF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,4BAA4B,CAAC,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE;gBAC3E,YAAY,EAAE,mBAAmB,IAAI,KAAK;gBAC1C,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpE,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/D,CAAC,CAAC;YACH,OAAO,QAAQ,CAAC;gBACd,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,UAAU,EAAE,OAAO,CAAC,MAAM;gBAC1B,YAAY,EAAE,OAAO;aACtB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Network } from '../../network.js';
2
+ export interface ResolvedTarget {
3
+ puzzleHash: string;
4
+ address: string;
5
+ network: Network;
6
+ }
7
+ /**
8
+ * Resolve a user-supplied "address or puzzle hash" into a normalized form.
9
+ * If both an address and a network argument are provided and they disagree,
10
+ * throws — better to surface the mismatch than silently pick one.
11
+ */
12
+ export declare function resolveAddressOrPuzzleHash(input: string, requestedNetwork: Network | undefined): ResolvedTarget;