Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "create_node" and "get_doc_page"
Deploy a new blockchain node. Call get_deployment_options first for valid IDs.TraderUsenodesaareGlobalregion-boundoption (e.g., London, Ashburn,node_tierSingapore"Global").Always confirm the region with the user before deploying — region cannot be changed afterfromdeployment.get_deployment_options.
⟨14 unchanged words⟩ },"cloud":{"description":"Cloud ID of a Global option from get_deployment_options (e.g., CC-0016for Global; Trader IDs vary by region).","type":"string"},"name" ⟨23 unchanged words⟩
⟨14 unchanged words⟩ field from\n a search_docs result (e.g., \"docs/ethereum-trader-nodes\docs/ethereum-tooling\").\n The leading slash, the `.mdx` extension ⟨18 unchanged words⟩
Changed the definition of "contact_chainstack", "create_node", "create_node_access_rule" and 20 more
before
—after
Contact Chainstack{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Contact Chainstack"}
before
—Changed the definition of "create_node", "get_deployment_options" and "request_testnet_funds"
⟨16 unchanged words⟩ Cloud ID from get_deployment_options (e.g., CC-0016 forGlobal,Global;CC-0020TraderforIDsLondonvary by region).","type":"string"},"name" ⟨23 unchanged words⟩
⟨25 unchanged words⟩ Added "create_node_access_rule", "delete_node_access_rule", "list_node_access_rules" and 2 more; changed the definition of "contact_chainstack" and "get_chainstack_pricing" (18 tools before, 23 now)
⟨85 unchanged words⟩ has a Chainstack API key configured, tell them: "I'llalso include your Chainstack account info (their org name and ID) sothe team canwillpullbeupincludedyoursoaccounttheimmediatelyteam
Changed the definition of "contact_chainstack", "create_node", "create_project" and 11 more
⟨397 unchanged words⟩ org info for faster account identification and handling.Args: message: The full message to send. Compose from conversation context — what the user is building, their plan and usage, what they need — so the Chainstack team can respond with a tailored answer instead of a generic one. category: Routing hint. One of: - sales — pricing, quotes, plan upgrades, custom terms. - support — errors, bugs, how-to, "something isn't working". - general — everything else. Case-insensitive. Unknown values fall back to "general". Default: "general". email: User's contact email. Required. Ask the user if you don't already have it. name: User's name (full name is fine, will be split on first space). Required. Ask the user if you don't have it on hand.
⟨3 unchanged words⟩ :{"category":{"default":"general","description":"Routing hint. One of:\n- sales — pricing, quotes, plan upgrades, custom terms.\n- support — errors, bugs, how-to, \"something isn't working\".\n- general — everything else.\nCase-insensitive. Unknown values fall back to \"general\".\nDefault: \"general\".","
Certificate recorded, valid to 2026-12-10
Authorization not required
First tool surface recorded: 18 tools (server version 1.10.10)
Showing the latest 8 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
after
Create node{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create node"}
before
—after
Create node access rule{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create node access rule"}
before
—after
Create project{"destructiveHint":false,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Create project"}
before
—after
Delete node{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Delete node"}
before
—after
Delete node access rule{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Delete node access rule"}
before
—after
Delete project{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Delete project"}
before
—after
Get Chainstack pricing{"destructiveHint":false,"openWorldHintidempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get Chainstack pricing"}
before
—after
Get deployment options{"destructiveHint":false,"openWorldHintidempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get deployment options"}
before
—after
Get docs page{"destructiveHint":false,"openWorldHintidempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get docs page"}
before
—after
Get node{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Get node"}
before
—after
Get organization{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Get organization"}
before
—after
Get platform status{"destructiveHint":false,"openWorldHintidempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Get platform status"}
before
—after
Get project{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"Get project"}
before
—after
List node access rules{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"List node access rules"}
before
—after
List nodes{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"List nodes"}
before
—after
List projects{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":true,"title":"List projects"}
before
—after
Request testnet funds{"destructiveHint":true,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Request testnet funds"}
before
—after
Search Chainstack docs{"destructiveHint":false,"openWorldHintidempotentHint":true,"openWorldHint":false,"readOnlyHint":true,"title":"Search Chainstack docs"}
before
—after
Activate or deactivate all node access rules{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Activate or deactivate all node access rules"}
before
—after
Rename node{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Rename node"}
before
—after
Update node access rule{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Update node access rule"}
before
—after
Update project{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false,"title":"Update project"}
⟨61 unchanged words⟩ returned `amountSent` so they see the actual delta. One top-up per network every 24 hours: a repeat call for the same network is refused (429) if the same organization or the same address got funds there in the last 24 hours, and the error says when the next top-up is available. Other networks have separate cooldowns. A success is final even if the balance hasn't updated yet; track the returned `transaction` instead of calling again.
⟨4 unchanged words⟩ ,"network":{"type":"string"},"note":{"type":"string"},"transaction":{"anyOf":[{"additionalProperties":true, ⟨8 unchanged words⟩
⟨63 unchanged words⟩ USD; disclaimers are surfaced in the `disclaimers` field.Design: we pass pricing.md through as raw markdown. Marketing owns that file and its structure changes freely; parsing it server-side would couple us to heading text and table column names we don't control. The LLM reads markdown natively, so handing the raw text to the agent keeps us correct regardless of how the page is restructured. pricing_current.json is parsed into `dedicated_catalog` because it has a stable engineering-owned schema, and the catalog benefits from filtering (to user-orderable SKUs only), unit conversion (cents → USD, milli-cores → cores), and region humanization (via `region_legend`).Per-method RU billing rules are NOT in these ⟨125 unchanged words⟩ sgp1"), hourly and monthly prices in USD.Already filtered to the ~87 orderable SKUs and unit-converted.- `region_legend`: slug →humancity namemap coveringfor every regionslugthat appearsslug in`dedicated_catalog`. Use `region_legend[slug]`to translate for display; `regions` keeps the`dedicated_catalog`;sluguseasittheforcanonical identifier.display. - `disclaimers`: list-price caveats (Enterprise "from" pricing, etc.). - `sources`: URL + ok/error per source; the JSON,source`warnings`:carriesper-sourceits ownstatus;`updated_at`. -warnings`warnings`:arepopulatedset when asourceis unreachablefailedorand theJSON parser failed. The tool still returnsresultbest-effortisresults.best-effort. - `fetched_at`: UTC timestamp of this call.
Add an IP or Origin allowlist rule to a Global node. New rules are deactivated and do nothing until activated. Active IP rules limit which client IPs can call the node; active origin rules limit which Origin headers it accepts. With both kinds active, a request must pass both. Everything else gets HTTP 403 within about 10 seconds. Rules don't affect the Chainstack API, so they can always be changed or deactivated with these tools. Before activating, confirm with the user that the IP rules cover every IP that calls the node (servers, CI, their own machine); you can't check this. Origin rules…
Delete an access rule from a node (irreversible). Deleting an active rule changes who can reach the node; the result says what's enforced afterwards. With no active rules left, the node accepts requests from any IP and origin.
List a node's access rules (IP and Origin allowlists, Global nodes only). With no active rules, the node accepts requests from any IP and origin. If correctly configured rules still return 403, that's a support case: offer contact_chainstack.
Activate or deactivate every access rule on a node at once. Activating enforces every rule within about 10 seconds: active IP rules limit which IPs can call the node, active origin rules limit which Origin headers it accepts, and a request must pass both kinds. Others get HTTP 403. First confirm with the user that the IP rules cover every IP that calls the node (servers, CI, their own machine); you can't check this. Origin rules block every request without an Origin header (servers, scripts, curl), even from an allowed IP. Deactivating opens the node to any IP and origin.
Change an access rule's value, or activate or deactivate it. A rule's type can't change; delete it and create a new one. Before activating, confirm with the user that the IP rules cover every IP that calls the node. Activating the first origin rule blocks every request without an Origin header (servers, scripts, curl), even from allowed IPs. Changing or deactivating a rule can block clients that only it allowed.
⟨28 unchanged words⟩ deploying — region cannot be changed after deployment.Args: name: Node name. project: Project ID from list_projects (e.g., PR-123-456-789). blockchain: Blockchain ID from get_deployment_options (e.g., BC-000-000-008). cloud: Cloud ID from get_deployment_options (e.g., CC-0016 for Global, CC-0020 for London).
{"additionalProperties":false,"properties":{"blockchain":{"description":"Blockchain ID from get_deployment_options (e.g., BC-000-000-008).","type":"string"},"cloud":{"description":"Cloud ID from get_deployment_options (e.g., CC-0016 for Global, CC-0020 for London).","type":"string"},"name":{"description":"Node name.","type":"string"},"project":{"description":"Project ID from list_projects (e.g., PR-123-456-789).","type":"string"}},"required":[" ⟨6 unchanged words⟩
Create a new project.Args: name: Project name. description: Optional description.
⟨3 unchanged words⟩ ":{"description":{"default":"","description":"Optional description.","type":"string"},"name":{"description":"Project name.","type":"string"}},"required":[" ⟨3 unchanged words⟩
Delete a node (irreversible).Args: node_id: Node ID (e.g., ND-123-456-789).
{"additionalProperties":false,"properties":{"node_id":{"description":"Node ID (e.g., ND-123-456-789).","type":"string"}},"required":["node_id ⟨2 unchanged words⟩
Delete a project (irreversible).Args: project_id: Project ID (e.g., PR-123-456-789).
{"additionalProperties":false,"properties":{"project_id":{"description":"Project ID (e.g., PR-123-456-789).","type":"string"}},"required":["project_id ⟨2 unchanged words⟩
⟨14 unchanged words⟩ the complete page when a snippet isn't enough.Args: page: Page path from search results — pass the `page` field from a search_docs result (e.g., "docs/ethereum-trader-nodes"). The leading slash, the `.mdx` extension, and the docs.chainstack.com URL prefix are all optional and stripped if present.
{"additionalProperties":false,"properties":{"page":{"description":"Page path from search results — pass the `page` field from\n a search_docs result (e.g., \"docs/ethereum-trader-nodes\").\n The leading slash, the `.mdx` extension, and the\n docs.chainstack.com URL prefix are all optional and stripped\n if present.","type":"string"}},"required":["page ⟨2 unchanged words⟩
Get a node's full details including endpoints and cloud info.Args: node_id: Node ID (e.g., ND-123-456-789).
{"additionalProperties":false,"properties":{"node_id":{"description":"Node ID (e.g., ND-123-456-789).","type":"string"}},"required":["node_id ⟨2 unchanged words⟩
Check platform status, active incidents, and maintenances.Args: network: Optional filter (e.g., "ethereum"). Without it, returns overall status and incidents only.
⟨3 unchanged words⟩ ":{"network":{"default":"","description":"Optional filter (e.g., \"ethereum\"). Without it, returns\n overall status and incidents only.","type":"string"}},"type":"object"}
Get project details.Args: project_id: Project ID (e.g., PR-123-456-789).
{"additionalProperties":false,"properties":{"project_id":{"description":"Project ID (e.g., PR-123-456-789).","type":"string"}},"required":["project_id ⟨2 unchanged words⟩
List nodes with status and connection endpoints.Args: project_id: Optional project ID to filter by (e.g., PR-123-456-789). If omitted, returns all nodes in the organization.
⟨3 unchanged words⟩ ":{"project_id":{"default":"","description":"Optional project ID to filter by (e.g., PR-123-456-789).\n If omitted, returns all nodes in the organization.","type":"string"}},"type":"object"}
⟨61 unchanged words⟩ returned `amountSent` so they see the actual delta.Supported networks and their native assets: - sepolia, hoodi — Ethereum testnets (ETH) - base — Base Sepolia (ETH) - amoy — Polygon Amoy (POL) - bnb-testnet — BNB Smart Chain testnet (BNB) - zksync-testnet — zkSync Sepolia (ETH) - robinhood — Robinhood Chain testnet (ETH) - hyperevm — HyperEVM testnet (HYPE) - plasma — Plasma testnet (XPL) - monad — Monad testnet (MON) - ton — TON testnet (TON) - solana — Solana devnet (SOL) Per-address cooldown applies after each successful drip. On cooldown the faucet returns a `nextFaucetAvailable` timestamp (ISO 8601) that this tool surfaces in the error message. Requires a Chainstack API key. The key is also the rate-limiting identity — the faucet tracks usage per organization. Get a key at https://console.chainstack.com/user/settings/api-keys and add it as `Authorization: Bearer <key>` in the MCP client config. Never ask the user to paste their API key in chat. Args: network: Canonical testnet id (the schema `enum` advertises the set). Case-insensitive; common aliases are normalized to the canonical id. address: Destination address. EVM hex address for EVM networks, a TON address for `ton`, or a base58 Solana public key for `solana`. Validated server-side — format errors surface as 400. Returns: On success: `{network, amountSent, transaction}`. `amountSent` is a string in the network's native unit (not wei/lamports).
{"additionalProperties":false,"properties":{"address":{"description":"Destination address. EVM hex address for EVM networks,\na TON address for `ton`, or a base58 Solana public key for\n`solana`. Validated server-side — format errors surface as 400.","type":"string"},"network":{"description" ⟨50 unchanged words⟩
⟨9 unchanged words⟩ Web3 APIs, deployment guides, and code examples.Args: query: Search query (e.g., "deploy ethereum node", "eth_call").
{"additionalProperties":false,"properties":{"query":{"description":"Search query (e.g., \"deploy ethereum node\", \"eth_call\").","type":"string"}},"required":["query ⟨2 unchanged words⟩
Rename a node.Args: node_id: Node ID (e.g., ND-123-456-789). name: New name.
{"additionalProperties":false,"properties":{"name":{"description":"New name.","type":"string"},"node_id":{"description":"Node ID (e.g., ND-123-456-789).","type":"string"}},"required":[" ⟨4 unchanged words⟩
Update a project's name or description.Args: project_id: Project ID (e.g., PR-123-456-789). name: New name. description: New description.
⟨7 unchanged words⟩ {"type":"null"}],"default":null,"description":"New description."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"New name."},"project_id":{"description":"Project ID (e.g., PR-123-456-789).","type":"string"}},"required":[" ⟨3 unchanged words⟩