chain-insights 0.58.2 → 0.58.3

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.
@@ -63,6 +63,7 @@ Supported config keys:
63
63
  | `graphMcpAuthToken` | Chain Insights Graph bearer credential for test access keys or local debug UAT |
64
64
  | `graphMcpMode` | Endpoint access mode: `paid` (default) or `debug` |
65
65
  | `walletAddress` | Optional wallet metadata |
66
+ | `serverPort` | Reserved. Default `4321`. No current command reads it |
66
67
  | `dataDir` | Local Chain Insights data directory |
67
68
  | `version` | Config schema version |
68
69
 
@@ -77,9 +78,12 @@ Default local data directory:
77
78
  ~/.chain-insights/
78
79
  config.json
79
80
  wallet.json
80
- mcp-schema-*.json
81
+ mcp-schema.json
81
82
  cache/
82
83
  schema-<network>-<endpoint hash>.json
84
+ runtime/
85
+ logs/
86
+ mcp-proxy.jsonl
83
87
  ```
84
88
 
85
89
  ## Security Model
package/docs/debugging.md CHANGED
@@ -25,30 +25,28 @@ Start your local Chain Insights Graph development endpoint with debug bearer
25
25
  auth enabled. The exact startup command depends on your Chain Insights Graph
26
26
  checkout or deployment.
27
27
 
28
- ```bash
29
- export CHAIN_INSIGHTS_GRAPH_ENDPOINT=http://localhost:8012/mcp
30
- export CHAIN_INSIGHTS_GRAPH_DEBUG_TOKEN=chain-insights-dev-debug
31
- ```
32
-
33
- Point Chain Insights at the local endpoint:
28
+ Point Chain Insights at the local endpoint. The debug token and the endpoint
29
+ are command arguments; the CLI reads no environment variable for them:
34
30
 
35
31
  ```bash
36
32
  node bin/cli.js debug on \
37
- --token "${CHAIN_INSIGHTS_GRAPH_DEBUG_TOKEN}" \
38
- --endpoint "${CHAIN_INSIGHTS_GRAPH_ENDPOINT}"
33
+ --token chain-insights-dev-debug \
34
+ --endpoint http://localhost:8012/mcp
39
35
  node bin/cli.js mcp tools --refresh
40
36
  ```
41
37
 
38
+ `cia debug off` returns to the paid production endpoint.
39
+
42
40
  ## Inspector
43
41
 
44
42
  Inspect the Chain Insights Graph endpoint directly:
45
43
 
46
44
  ```bash
47
45
  npx @modelcontextprotocol/inspector \
48
- --cli "${CHAIN_INSIGHTS_GRAPH_ENDPOINT:-http://localhost:8012/mcp}" \
46
+ --cli http://localhost:8012/mcp \
49
47
  --transport http \
50
48
  --method tools/list \
51
- --header "X-MCP-Debug-Token: ${CHAIN_INSIGHTS_GRAPH_DEBUG_TOKEN:-chain-insights-dev-debug}"
49
+ --header "X-MCP-Debug-Token: chain-insights-dev-debug"
52
50
  ```
53
51
 
54
52
  Inspect the Chain Insights proxy:
@@ -61,9 +59,25 @@ npx @modelcontextprotocol/inspector \
61
59
 
62
60
  ## Environment Variables
63
61
 
64
- | Variable | Purpose |
65
- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
66
- | `CIA_ACTION_LOG` | Optional path to an append-only JSONL audit log of every MCP tool invocation (tool name, arguments, outcome, duration, and any `warnings`/`search_limits` surfaced by the result). Unset by default — no file is written. Intended for unattended runs where an operator or a later reviewing agent needs to see what ran and why a result looked the way it did. Never causes a tool call to fail: a write error (including an unwritable path) is swallowed silently. |
62
+ Every variable the CLI and the proxy read. None is required.
63
+
64
+ | Variable | Purpose |
65
+ | ----------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
66
+ | `CHAIN_INSIGHTS_GRAPH_MCP_ENDPOINT` | Chain Insights Graph endpoint override. Wins over the saved `graphMcpEndpoint`. `GRAPH_MCP_ENDPOINT` is the legacy alias. |
67
+ | `BASE_RPC_URL` | Base RPC override for the wallet balance and the local top-up page. |
68
+ | `CHAIN_INSIGHTS_MCP_LOG` | `0` turns the proxy's runtime log off. On by default. |
69
+ | `CHAIN_INSIGHTS_MCP_LOG_PATH` | Where the proxy writes its runtime log. Default `~/.chain-insights/runtime/logs/mcp-proxy.jsonl` (under the configured `dataDir`). |
70
+ | `CIA_ACTION_LOG` | Optional path to an append-only JSONL audit log of every MCP tool invocation (tool name, arguments, outcome, duration, and any `warnings`/`search_limits` surfaced by the result). Unset by default — no file is written. Intended for unattended runs where an operator or a later reviewing agent needs to see what ran and why a result looked the way it did. Never causes a tool call to fail: a write error (including an unwritable path) is swallowed silently. |
71
+ | `CHAIN_INSIGHTS_SKIP_UPDATE_CHECK` | `1` skips the update prompt `cia` shows in a terminal when npm has a newer release. |
72
+ | `CHAIN_INSIGHTS_NPM_REGISTRY_URL` | Registry the update check asks. Default npmjs. |
73
+ | `CHAIN_INSIGHTS_MAX_AUTO_APPROVAL_USDC` | Ceiling of the one-time USDC approval `cia wallet ready` grants. |
74
+ | `CHAIN_INSIGHTS_PAYMENT_ASSET_PREFERENCE` | Comma-separated symbols or addresses (`CHOICE,USDG,USDC`) that order the payment assets a server offers. Empty keeps the server's order. |
75
+ | `CHAIN_INSIGHTS_MCP_PROXY_MODE` | Proxy mode. The default, and the only public mode, is stateless. |
76
+ | `CHAIN_INSIGHTS_WORKSPACE` | Workspace root for the non-public workspace commands. |
77
+ | `CHAIN_INSIGHTS_SKILL_REFRESH` | `0` stops the proxy from bringing the installed skill copies up to its own release at start. |
78
+
79
+ The proxy's runtime log holds `tool.start`, `tool.end`, `topology.start`,
80
+ `topology.end` and `cypher.throw` events as JSON lines.
67
81
 
68
82
  ## Smoke Checks
69
83
 
@@ -309,40 +309,26 @@ The translator compiles a defined grammar to StarRocks SQL. All literals are
309
309
  bound as parameters (no SQL injection surface). Anything outside the grammar is
310
310
  rejected with a typed contract error before execution.
311
311
 
312
- ### Supported
313
-
314
- | Construct | Notes |
315
- | -------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
316
- | `MATCH` on a mapped node / single relationship | `(from:Address)-[t:TRANSFER]->(to:Address)` (bounded individual transfer rows from `facts_transfers_view`). Lifetime address metrics are node properties on `USE topology` (the facts `AddressFeature` surface is retired). `SWAP`, `LIQUIDITY_ADD`, `LIQUIDITY_REMOVE` and `BRIDGE_CROSSING` are single-event rows on the same pattern, each with its own indexed predicate. Never serves `FLOWS_TO`, `OPERATED_BY`, `LINKED`, `SWAPPED`, `ADDED_LIQUIDITY`, `REMOVED_LIQUIDITY` or `BRIDGED` — those are topology-only. Labels and per-label risk live on the topology address node, not on `facts`. |
317
- | Chained fixed-hop patterns | up to 5 hops |
318
- | Bare `block_date` bound | `t.block_date >= ?` / `<`, `<=`, `>`, `=` — the caller's own day range, passed through. `BETWEEN` and `IN` are refused (`unsupported WHERE operator`): write a range as `>=` and `<`. The bound must be bare (no function around the column) and conjunctive (not inside an `OR` arm). An explicit full-range bound (`>= '1970-01-01'`) stays lifetime. |
319
- | `tx_id` equality | `t.tx_id = "…"` — a point lookup on the `TRANSFER` edge's row-level key; on EVM networks the `0x` transaction hash, served from the indexed hash columns. Lifetime semantics. `IN` and `BETWEEN` are refused (`unsupported WHERE operator "IN"`): send one equality per transaction, several in one `graph_query_batch`. |
320
- | Time window inside a bare `block_date` bound | `t.block_date = "2026-07-11" AND t.block_timestamp >= 1783738500000 AND t.block_timestamp < 1783738560000` — the day bound with `=`, `>=`, `>`, `<` or `<=`; `block_timestamp` (epoch milliseconds) with `>=`, `>`, `<` or `<=`, not `=` (one instant is `>= x AND <= x`); `block_height` (a block number) with `=`, `>=`, `>`, `<` or `<=`. `BETWEEN` and `IN` are refused. The window compiles to the day's block key range. On their own these two columns bound nothing (see the cost-shape gate). |
321
- | Address equality | `{address:"…"}` map or `a.address = "…"` — **a recency window is auto-applied** (bare `block_date >= now − 90 days`; the window is `FACTS_RECENCY_WINDOW_DAYS`, default 90). Address-only queries return the last 90 days. `IN` is refused: send one equality per address, several in one `graph_query_batch`. |
322
- | Inline property maps | `MATCH (a:Address {address:"…"})` |
323
- | Property projections with aliases | `RETURN a.address AS address, t.amount_usd AS amount_usd` |
324
- | Aggregates **with** a partition-bounding predicate | `count`, `sum` |
325
- | `ORDER BY`, `LIMIT` (≤ 1000), `OFFSET`-free paging | `LIMIT` required unless a partition-bounding predicate is present — except `TRANSFER`, where a partition-bounding predicate is always required (see below) |
326
-
327
- ### Cost-shape gate
328
-
329
- `facts` rejects full-scan shapes so a mapped-graph read cannot turn into an
330
- unbounded warehouse scan. `core_transfers` is split into one partition per
331
- day, keyed on `block_date` — a query without a bare `block_date` bound, a
332
- `tx_id` point lookup, or an address filter (window auto-applied) touches
333
- every partition and is refused before any SQL runs. The refusal names the
334
- remedy: _add a bare `block_date` bound, or query by `tx_id`, or filter by
335
- address (a recency window is auto-applied)_.
336
-
337
- | Rejected shape | Contract error |
338
- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
339
- | Predicate-less global aggregate | `count(i)` with no partition-bounding predicate → _StarRocks-backed aggregate graph queries require a partition-bounding predicate: add a bare `block_date` bound, or query by `tx_id`, or filter by address (a recency window is auto-applied)_ |
340
- | No `LIMIT` and no partition-bounding predicate | → _StarRocks-backed graph queries require an explicit LIMIT or partition-bounding predicate: add a bare `block_date` bound, or query by `tx_id`, or filter by address (a recency window is auto-applied)_ |
341
- | `TRANSFER` row-select or aggregate with no partition-bounding predicate, even with `LIMIT` | `facts_transfers_view` is a full transfer-history table — a bare `LIMIT` does not bound the scan → _StarRocks-backed TRANSFER graph queries require a partition-bounding predicate: add a bare `block_date` bound, or query by `tx_id`, or filter by address (a recency window is auto-applied)_ |
342
- | `block_height` / `block_timestamp` range only | `t.block_height >= ?` bounds the sort key, not the day partitions → rejected with the remedy error |
343
- | Wrapped `block_date` | `DATE(t.block_date) >= ?` wraps the partition column → rejected with the remedy error |
344
- | `block_date` bound inside an `OR` arm | `t.block_height >= 0 OR t.block_date >= ?` — the optimizer cannot prune the unbounded arm → rejected with the remedy error |
345
- | `LIMIT` above the ceiling | `LIMIT 5000` → _StarRocks-backed graph query LIMIT exceeds maximum 1000_ |
312
+ ### A facts read names an address pair with one day
313
+
314
+ `USE facts` looks up rows you already know. The rule is stated once, in the
315
+ [`chain-insights-cypher` skill](../skills/chain-insights-cypher/SKILL.md#facts-an-address-pair-with-one-day),
316
+ and the server admits exactly that shape:
317
+
318
+ | Construct | Notes |
319
+ | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
320
+ | `MATCH` on a mapped node / single relationship | `(from:Address {address:"…"})-[t:TRANSFER]->(to:Address {address:"…"})`. `SWAP`, `LIQUIDITY_ADD`, `LIQUIDITY_REMOVE` and `BRIDGE_CROSSING` are single-event rows on the same pattern. Never serves `FLOWS_TO`, `OPERATED_BY`, `LINKED`, `SWAPPED`, `ADDED_LIQUIDITY`, `REMOVED_LIQUIDITY` or `BRIDGED`. |
321
+ | The pair | Both addresses, from then to, each as `{address: "…"}`. One address alone is refused (`facts_no_anchor`). `IN` is refused: one read per pair, several in one `graph_query_batch`. |
322
+ | The day | `t.block_date = "YYYY-MM-DD"`. A day alone, a window of days, a block range and a bare `LIMIT` are not enough. For more days, send one read per day. |
323
+ | A time window inside the day | `t.block_timestamp >= 1783738500000 AND t.block_timestamp < 1783738560000` beside the day equality narrows the day to a window. `block_timestamp` is epoch milliseconds. On its own it bounds nothing. |
324
+ | `tx_id` equality | `t.tx_id = "…"` reads the rows of one transaction. `IN` is refused: one equality per transaction, several in one `graph_query_batch`. The chain's own record of a transaction (status, block, day) is a `USE chain` read. |
325
+ | `kind` filter | `t.kind = "internal"` beside the pair and the day narrows the read. It never replaces them. |
326
+ | Property projections with aliases | `RETURN a.address AS address, t.amount_usd AS amount_usd` |
327
+ | Aggregates | `count()` and `sum()` only, over the whole page. No grouping key, no `min()`, `max()` or `avg()` (`unsupported facts query shape`). |
328
+ | `LIMIT` | Optional. A reply holds at most 200 rows. No `ORDER BY`: rows come in the server's own order, sort the page yourself. |
329
+
330
+ A refusal names the shape it wants. Read its `fix` and rewrite the query from
331
+ its `example` once.
346
332
 
347
333
  ### `TRANSFER` rows and `kind`
348
334
 
@@ -376,7 +362,9 @@ StarRocks. Use the topology graph, or restructure:
376
362
  | Construct | Instead |
377
363
  | ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
378
364
  | `FLOWS_TO` / `OPERATED_BY` topology edges | The topology graph — facts never serves either |
379
- | `OPERATED_BY` | The topology graph — operator topology is topology-only |
365
+ | A hop: two relationships in one pattern | The topology graph — a facts read has one relationship |
366
+ | `ORDER BY` | Sort the page yourself |
367
+ | One address with no counterparty, a day range, a block range, a bare `LIMIT` | Name the pair and one day; pick the pairs on the topology graph first |
380
368
  | `SWAPPED`, `ADDED_LIQUIDITY`, `REMOVED_LIQUIDITY`, `BRIDGED`, the `:Pool` label | The topology graph. Facts serves the single events as `SWAP`, `LIQUIDITY_ADD`, `LIQUIDITY_REMOVE` and `BRIDGE_CROSSING` |
381
369
  | Quantified paths and shortest selectors | The topology graph, or a single fixed-hop `LINKED` pattern |
382
370
  | `WITH` pipelines | The topology graph |
@@ -434,9 +422,8 @@ reads it at one block.
434
422
  - **Shortest paths rank by hop count.** Weighted money paths are not part of
435
423
  the product. Use `SHORTEST 1` with a quantified bound instead of enumerating
436
424
  hops client-side.
437
- - **Facts stays fixed-hop.** For bounded transfer rows and, until P3,
438
- address features, write one explicit pattern per shape and batch them
439
- with `graph_query_batch`.
425
+ - **Facts stays one pair, one day.** Write one explicit pattern per pair and
426
+ per day and batch them with `graph_query_batch`.
440
427
  - When a query is rejected, read the returned contract error — it names the exact
441
428
  violated bound or unsupported shape.
442
429
 
@@ -10,11 +10,14 @@ the `cia mcp` commands. Results are returned as text and structured facts.
10
10
 
11
11
  The Chain Insights Graph surface is intentionally small:
12
12
 
13
- | Tool | Purpose |
14
- | ---------------------- | --------------------------------------------------------------------------------------- |
15
- | `network_capabilities` | Return supported networks and graph layers when the backend exposes capability metadata |
16
- | `graph_query` | Run one read-only GQL/Cypher query through the universal graph endpoint |
17
- | `graph_query_batch` | Run related read-only graph-language queries as one MCP call |
13
+ | Tool | Purpose |
14
+ | ------------------- | ----------------------------------------------------------------------- |
15
+ | `graph_query` | Run one read-only GQL/Cypher query through the universal graph endpoint |
16
+ | `graph_query_batch` | Run related read-only graph-language queries as one MCP call |
17
+
18
+ The networks and layers a backend serves are read through
19
+ `meta_network_capabilities`; the backend's own capability tool is never
20
+ exposed by name.
18
21
 
19
22
  `aml_address_risk` is hidden until its verdict is fixed. The MCP proxy does
20
23
  not list it and refuses a call to it as an unknown tool.
@@ -25,8 +28,9 @@ indexed, and `cia mcp networks` for the full network capability matrix with
25
28
  each network's remote tools.
26
29
  Use `cia mcp call` for low-level GraphRAG calls and custom read-only queries.
27
30
 
28
- The Chain Insights MCP proxy adds product-facing local metadata tools such as
29
- `meta_network_capabilities`, `meta_schema`, `meta_usage_status`, and `meta_help`. On hosted
31
+ The Chain Insights MCP proxy adds the local tools `meta_network_capabilities`,
32
+ `meta_schema`, `meta_rules`, `meta_help`, `meta_usage_status`,
33
+ `meta_subscription_status`, `wallet_balance` and `wallet_topup`. On hosted
30
34
  backends, `meta_usage_status` can reflect remote quota telemetry. On
31
35
  backends without a quota tool, Chain Insights returns a local unmetered
32
36
  primitive-backend status instead.
@@ -341,7 +345,7 @@ and `:Sanctioned`. Each role also has a flag on the node.
341
345
  `kind` is a column and a filter. Add `t.kind = "internal"` to the pair and the
342
346
  day to read only the internal rows.
343
347
  - Use `meta_usage_status` through Chain Insights before public hosted reads
344
- when you need the caller's remaining free-demo allowance.
348
+ when you need the caller's remaining free-tier allowance.
345
349
  - Hosted endpoints expose a free tier for graph_query and graph_query_batch:
346
350
  5,000 units a day per address (an IP address block), 30 requests a minute,
347
351
  reset at midnight UTC. A unit is one returned row, node, edge or list
@@ -357,11 +361,12 @@ and `:Sanctioned`. Each role also has a flag on the node.
357
361
  sets.
358
362
  - Chain Insights Graph does not append `LIMIT`; Chain Insights recipes own their
359
363
  own limits and pagination.
360
- - Use bounded `graph_query` calls for public no-wallet free-demo usage.
364
+ - Use bounded `graph_query` calls for public no-wallet free-tier usage.
361
365
  `graph_query_batch` is also included in the free tier; use it for related
362
366
  reads that should share one call.
363
- - `per_query_timeout_seconds` is optional and capped at `60` by default (`30` for
364
- `USE facts`). It can lower a limit. It cannot raise one.
367
+ - `per_query_timeout_seconds` is a `graph_query_batch` argument only. It is
368
+ optional and capped at `60` by default (`30` for `USE facts`). It can lower a
369
+ limit. It cannot raise one. `graph_query` takes no timeout argument.
365
370
  - Returned rows live in `structuredContent.facts`.
366
371
 
367
372
  Agent installers ship one skill:
@@ -407,8 +412,8 @@ cia mcp call graph_query_batch \
407
412
  ```
408
413
 
409
414
  A batch is one call and counts the units of all its returned rows. The free
410
- demo includes batches. On public hosted endpoints, a batch that would pass
411
- the remaining free-demo allowance can ask for paid x402 access.
415
+ tier includes batches. On public hosted endpoints, a batch that would pass
416
+ the remaining free-tier allowance can ask for paid x402 access.
412
417
 
413
418
  Batch result facts include:
414
419
 
@@ -432,7 +437,7 @@ Hosted `USE topology` queries share one graph database, so every query is
432
437
  bounded:
433
438
 
434
439
  - **Time:** the graph database stops a query when its time budget ends
435
- (60 seconds by default, or your lower `per_query_timeout_seconds`).
440
+ (60 seconds by default, or the lower `per_query_timeout_seconds` of a batch).
436
441
  - **Concurrency:** topology queries share the slots of the hosted endpoint, so
437
442
  a query waits for a free slot inside its own time budget, and a busy endpoint
438
443
  answers `topology_busy`. The number of slots is the server's to publish, not
package/docs/mcp-proxy.md CHANGED
@@ -81,8 +81,10 @@ The proxy:
81
81
  | --------------------------- | ------------------------------------------------------------------------------------ |
82
82
  | `meta_network_capabilities` | Show the current Chain Insights network/tool support matrix |
83
83
  | `meta_schema` | Show the live graph schema of a network: labels, link types, fields, indexes |
84
- | `meta_usage_status` | Check the caller's daily free-demo graph query allowance |
84
+ | `meta_rules` | Read the answer rules when the `chain-insights-cypher` skill is not loaded |
85
85
  | `meta_help` | Show Chain Insights tool and workflow guidance |
86
+ | `meta_usage_status` | Check the caller's daily free-tier graph query allowance |
87
+ | `meta_subscription_status` | Check the caller's $CIA subscription window and allowance |
86
88
  | `wallet_balance` | Show the local payment wallet address, payment network, token, and amount |
87
89
  | `wallet_topup` | Show the local payment wallet address and its QR code, with a Claude view |
88
90
  | `graph_expand` | Expand a node or list a link's transfers in an open picture; called by the view only |
@@ -242,7 +244,7 @@ cia access-key set ci_test_REDACTED --endpoint https://mcp.chain-insights.ai/
242
244
  cia access-key status
243
245
  ```
244
246
 
245
- Daily free-demo graph usage:
247
+ Daily free-tier graph usage:
246
248
 
247
249
  ```bash
248
250
  cia mcp call meta_usage_status
@@ -282,11 +284,6 @@ cia mcp call --json graph_query \
282
284
  "query=USE topology MATCH (a:Address) RETURN a.address AS address LIMIT 10"
283
285
  ```
284
286
 
285
- UAT on 2026-05-31 showed the earlier free tier was enough for exact
286
- address checks, sample address reads, sample flow reads, and the
287
- free-to-paid handoff, but bounded sample reads still returned topology data
288
- inside the same daily allowance.
289
-
290
287
  For graph reads, install `chain-insights-cypher`. It teaches ISO GQL, the
291
288
  three read layers, one query for each kind of graph search, and how to find
292
289
  the fields of the graph.
@@ -341,9 +338,13 @@ flags:
341
338
  cia setup claude-code
342
339
  cia setup claude-desktop
343
340
  cia setup codex
341
+ cia setup chatgpt
344
342
  cia setup hermes
345
343
  ```
346
344
 
345
+ `cia setup chatgpt` sets up the ChatGPT desktop app: its Codex chats run
346
+ Chain Insights. Ask there, not in a plain ChatGPT chat.
347
+
347
348
  `cia setup claude` is an alias for `cia setup
348
349
  claude-code`. `cia setup claude-desktop` writes the proxy into Claude
349
350
  Desktop's `claude_desktop_config.json`, keeps every other entry, saves a
@@ -365,7 +366,9 @@ the plugin: `codex plugin remove chain-insights@chain-insights`, then
365
366
  Current MCP prompts exposed by the local proxy:
366
367
 
367
368
  - `meta-network-capabilities`
369
+ - `meta-schema`
368
370
  - `meta-usage-status`
371
+ - `meta-subscription-status`
369
372
  - `graph-query`
370
373
  - `graph-query-batch`
371
374
  - `wallet-balance`
package/docs/stability.md CHANGED
@@ -18,17 +18,23 @@ Exit codes are contract. Scripts and agent harnesses may rely on them.
18
18
 
19
19
  ### MCP tool names
20
20
 
21
- The public MCP surface is these eight tools:
21
+ The public MCP surface is these ten tools:
22
22
 
23
23
  - `graph_query`
24
24
  - `graph_query_batch`
25
- - `meta_help`
26
25
  - `meta_network_capabilities`
27
26
  - `meta_schema`
27
+ - `meta_rules`
28
+ - `meta_help`
28
29
  - `meta_usage_status`
30
+ - `meta_subscription_status`
29
31
  - `wallet_balance`
30
32
  - `wallet_topup`
31
33
 
34
+ `graph_expand` is the eleventh tool the proxy registers. The view calls it
35
+ when you click in a picture; hosts keep it out of the model's tool list. It
36
+ is not part of the public surface.
37
+
32
38
  Tool names are contract. Removing or renaming one is a deprecation event.
33
39
  Tool _arguments_ may grow additively at any time; existing argument names and
34
40
  meanings are stable.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chain-insights",
3
- "version": "0.58.2",
3
+ "version": "0.58.3",
4
4
  "description": "AML investigation CLI and MCP proxy for blockchain risk screening and Chain Insights Graph access",
5
5
  "homepage": "https://chain-insights.ai",
6
6
  "repository": {