Skip to main content
Glama

horizen-mcp

npm

An MCP server that gives coding agents accurate, sourced facts about the Horizen chain — so they stop guessing.

When you ask an agent to deploy a contract on Horizen, configure a bridge, or integrate Stork oracle or zkVerify, it needs ground truth: the right chain ID, the right RPC URL, the right contract address. This server provides that — typed, versioned, with explicit provenance on every value. If something isn't in the registry, the agent is told so explicitly rather than making something up.


Quickstart

Claude Code

Add to ~/.claude/claude_desktop_config.json (or your project's .claude/mcp.json):

{
  "mcpServers": {
    "horizen": {
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  }
}

Claude Desktop

Same config file as Claude Code — ~/.claude/claude_desktop_config.json:

{
  "mcpServers": {
    "horizen": {
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "horizen": {
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "horizen": {
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  }
}

Cline (VS Code)

Open the Cline extension → MCP Servers tab → Edit MCP Settings → add:

{
  "mcpServers": {
    "horizen": {
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  }
}

Continue (VS Code / JetBrains)

Add to ~/.continue/config.json:

{
  "mcpServers": [
    {
      "name": "horizen",
      "command": "npx",
      "args": ["-y", "horizen-mcp"]
    }
  ]
}

Zed

Add to ~/.config/zed/settings.json:

{
  "context_servers": {
    "horizen": {
      "command": {
        "path": "npx",
        "args": ["-y", "horizen-mcp"]
      }
    }
  }
}

Restart your editor after saving. The server starts on demand — no separate process to manage.


Related MCP server: rome-cli MCP server

What you can ask

Once connected, your agent has access to Horizen chain facts through natural language:

Network info

"What's the Horizen mainnet chain ID and RPC URL?" "Give me the testnet explorer URL for Horizen."

Contract addresses

"What's the Stork oracle address on Horizen?" "What's the PureFi verifier proxy address I should integrate against?" "Is Uniswap deployed on Horizen mainnet?"

Oracle feeds

"What's the Stork feed ID for ETHUSD on Horizen?" "How do I derive a Stork feed ID for a custom asset?"

Bridges

"How do I bridge assets to Horizen?" "Does Stargate support ETH on Horizen?"

Integrations

"How do I integrate Stork oracle on Horizen?" "Can I use Den from the command line, or is it browser-only?" "Where are the Goldsky indexing docs for Horizen?" "Can I use zkVerify with Horizen? What's the contract address?" "What's the zkVerify verifier address on Horizen testnet?"

Docs search

"Search the Horizen docs for compliance gating." "Find the Horizen tutorial for setting up a multisig."


Tools

Tool

What it does

get_chain_info

Chain ID, RPC/WS URLs, explorer, gas token, settlement layer for mainnet or testnet

get_contract_address

Verified address for a given contract + network. Returns explicit not-found on miss — never fabricates.

list_contracts

All contracts in the registry with per-network deployment status

get_stork_feed_id

Stork oracle feed ID for an asset (e.g. ETHUSD), computed via keccak256

get_bridge_info

Bridge URLs, supported assets, and caveats — native bridge vs. Stargate

get_integration_info

Docs paths, access method, status for Stork, Goldsky, PureFi, Den, zkVerify

search_docs

Live search across docs.horizen.io with title, URL, and excerpt

Every response includes a source field and a verified date. If a value isn't in the registry, the agent gets an explicit not-found with a list of what is known — never a guess.


Run from source

git clone https://github.com/horizenio/horizen-mcp
cd horizen-mcp
npm install
npm run build
node dist/index.js

To point your editor at a local build instead of npm:

{
  "mcpServers": {
    "horizen": {
      "command": "node",
      "args": ["/path/to/horizen-mcp/dist/index.js"]
    }
  }
}

Development

npm run dev        # watch mode — recompiles on save
npm run inspect    # MCP Inspector UI for interactive tool testing

The Inspector lets you call any tool directly and inspect the full JSON response before connecting to an editor.


Data

All facts live in data/chain-facts.json. Tool handlers query this file — nothing is hardcoded in source. To update a value, edit that file and run npm run build.

Every entry carries a source (URL or attribution) and a verified date. Values that haven't been confirmed are left as null rather than guessed — the tool will tell the agent the value is unknown rather than returning something fabricated.


Contributing

See CONTRIBUTING.md for how to add contracts, integrations, or tools.


License

MIT

Available Tools

9 tools
check_zkverify_statusA

Check whether a zkVerify proof aggregation has been posted to Horizen by reading the zkVerify aggregation proxy contract. Two modes: (1) existence check — provide domainId and aggregationId only; reads proofsAggregations(domainId, aggregationId) and returns the Merkle root if posted; (2) full verification — also provide leaf, merklePath, leafCount, and index to call verifyProofAggregation(domainId, aggregationId, leaf, merklePath, leafCount, index) and get a definitive on-chain bool. Supports both mainnet (0xCb47A3C3B9Eb2E549a3F2EA4729De28CafbB2b69) and testnet (0x3098A6974649478f0133046e44105AA84e868C21).

ParametersJSON Schema
NameRequiredDescriptionDefault
leafNoYour proof's leaf hash in the aggregation Merkle tree. Obtained via aggregate_statementPath RPC on the zkVerify node.
indexNoIndex of your proof leaf within the aggregation Merkle tree.
networkNoHorizen network to check. Mainnet is the default. Testnet uses a different contract address.mainnet
domainIdYeszkVerify domain ID — identifies the aggregation domain. Obtained from the zkVerify SDK after proof submission.
leafCountNoTotal number of leaves in the aggregation Merkle tree.
merklePathNoMerkle proof path from your leaf to the aggregation root. Obtained via aggregate_statementPath RPC.
aggregationIdYeszkVerify aggregation ID. Obtained from the zkVerify SDK after proof submission.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the full burden, and it does well. It states the underlying contract reads (proofsAggregations and verifyProofAggregation), what each returns ('returns the Merkle root if posted' and 'get a definitive on-chain bool'), and provides the exact contract addresses for both networks. It doesn't detail error handling or exact return structures, but for a read-only check this is sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single dense paragraph but every sentence earns its place: purpose, two modes, contract addresses, and network support. It is well-structured with clear mode separation, though it could be slightly more concise by trimming redundant phrasing. It's appropriately sized for a tool with 7 parameters and two modes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, two modes, two networks) and no output schema, the description is remarkably complete. It explains both modes, the required parameters for each, the network options with contract addresses, and the expected return values (Merkle root or bool). Nothing essential for an agent to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with rich per-parameter descriptions, so the baseline is 3. The tool description adds relational meaning by explaining which parameters belong to which mode and that leaf, merklePath, leafCount, and index are only required for full verification. It also ties parameters to the RPC source ('Obtained via aggregate_statementPath RPC'), which enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a clear verb+resource statement: 'Check whether a zkVerify proof aggregation has been posted to Horizen by reading the zkVerify aggregation proxy contract.' It specifies two distinct modes with concrete on-chain calls, making it unambiguous and clearly differentiated from sibling tools that deal with integration/chain info, contract addresses, and price feeds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly details when to use each mode: 'Two modes: (1) existence check — provide domainId and aggregationId only; ... (2) full verification — also provide leaf, merklePath, leafCount, and index.' It also clarifies the network selection with 'Supports both mainnet... and testnet' and the default. This gives direct, actionable guidance without needing to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_stork_priceA

Perform an authenticated pull from the Stork REST API to get a live signed price update for an asset. Returns the full signed payload with each field annotated with its correct Solidity type (timestampNs as uint64 in nanoseconds; quantizedValue as int192 — not uint256). Use the solidityCallData field directly when constructing an updateTemporalNumericValueV1 call.

ParametersJSON Schema
NameRequiredDescriptionDefault
apiKeyYes
assetIdYes
baseUrlNoStork REST API base URL. Defaults to https://rest.jp.stork-oracle.network

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses that the operation is authenticated, returns a full signed payload, and annotates field types (e.g., uint64, int192). It implies a read-only pull and does not mention side effects, which is appropriate. It does not cover error behavior or rate limits, but that is not critical for this simple fetch.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no fluff. The purpose is front-loaded, and each sentence adds value: purpose, return format with types, and usage guidance. Perfectly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite lacking an output schema, the description covers the core return information (signed payload, field types, and how to use the call data). It does not detail the full response structure or error cases, but for a straightforward price fetch it is adequate. The tool's simplicity and clear purpose make this acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33% (only baseUrl has a description). The description does not explicitly explain apiKey or assetId beyond implying them via 'authenticated' and 'for an asset'. It does not mention the default baseUrl or any parameter specifics, leaving the agent to rely on schema patterns. Given low coverage, the description should compensate but fails to do so.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Perform an authenticated pull') and a clear resource ('live signed price update for an asset'). It also adds unique details like returning a signed payload with Solidity type annotations, which clearly distinguishes it from the sibling info tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context on when to use the tool (to get a signed price update) and even provides guidance on using the returned solidityCallData field in a downstream contract call. However, it does not explicitly contrast with sibling tools or state when not to use it, though the purpose is distinct enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bridge_infoA

Get bridge information for Horizen. Covers the native Caldera bridge and Stargate (LayerZero OFT). Always includes caveats about ETH/Stargate limitations.

ParametersJSON Schema
NameRequiredDescriptionDefault
bridgeNo
networkNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It does disclose a relevant behavior: 'Always includes caveats about ETH/Stargate limitations,' which sets expectations. However, it does not mention return shape, failure modes, or any other limitations, so the behavioral disclosure is only partial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each with a distinct purpose: state the tool's goal, its scope, and a behavioral guarantee. No filler or redundant phrasing; the most identifying information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple info-getting tool, the description covers the core subject and even highlights recurring caveats. But with no output schema, no annotations, and no guidance on default behavior when optional parameters are omitted, the description leaves some practical usage questions unanswered.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does add meaning for one enum: 'native Caldera bridge and Stargate (LayerZero OFT)' explains the bridge parameter values. However, the network parameter is not mentioned at all, leaving half the parameter space unexplained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Get bridge information for Horizen.' It also clarifies scope by naming the two covered bridges (native Caldera and Stargate/LayerZero OFT), which clearly distinguishes it from sibling tools like get_chain_info or get_token_info.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for bridge-related queries on Horizen, but it never explicitly says when to use it instead of a sibling tool or what to do when bridge or network is omitted. The context is clear enough that an agent could infer usage, but no direct guidance or exclusions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_chain_infoA

Get Horizen network metadata: chain ID, RPC URL, explorer URL, gas token, settlement layer.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and it does indicate the operation is a retrieval and what output fields to expect. It does not disclose anything beyond the returned fields, such as network availability, auth requirements, or response structure, so transparency is adequate but limited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One compact sentence with a clear front-loaded verb and a tidy list of the returned metadata. No filler or duplication.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter getter with no output schema, the description lists the substantive return fields, while the schema documents the only input. Minor omissions such as output formatting/response details prevent a 5, but nothing essential is missing for selecting or calling the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the only parameter ('network') has a self-documenting enum (mainnet/testnet). The description adds no explicit explanation of the parameter, though the word 'network' in the description and the enum together make it unambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('Get') and resource ('Horizen network metadata') and enumerates concrete fields (chain ID, RPC URL, explorer URL, gas token, settlement layer). This specificity makes it distinguishable from siblings like get_bridge_info or get_token_info even without an explicit comparison.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is appropriate whenever an agent needs Horizen chain-level metadata, listing the exact fields available. It does not, however, state when to prefer this over sibling tools or give any exclusions, so guidance is only implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contract_addressB

Get a verified contract address on Horizen mainnet or testnet. Returns explicit not-found when unavailable — never guesses.

ParametersJSON Schema
NameRequiredDescriptionDefault
networkYes
contractYes

TDQS

B3.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses a meaningful behavioral guarantee ('Returns explicit not-found when unavailable — never guesses') and clarifies that only verified addresses are returned. It still omits return format and data-source details, but for a simple lookup this is solid coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences with no filler. The core operation and the useful not-found behavior are both front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple and the description covers its core use, network scope, and failure behavior. However, the ambiguous 'contract' parameter and the absence of sibling routing make it only minimally complete for confident agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It clarifies 'network' by naming mainnet/testnet, but leaves 'contract' underspecified: an agent cannot tell whether to pass a symbol, name, or address, which is critical for a contract-address lookup.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific operation ('Get ... verified contract address') and scopes it to Horizen mainnet or testnet. The 'verified' qualifier and not-found guarantee help separate it from generic address/contract lookups, but it does not explicitly contrast with sibling tools, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No sentence explains when to choose this tool over siblings such as get_token_info or list_contracts. The only contextual hint is the network scope in the first sentence, which is implied usage rather than actual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_integration_infoB

Get details about a Horizen integration (stork, goldsky, purefi, den, zkverify) — category, status, supported networks, access method, and docs paths.

ParametersJSON Schema
NameRequiredDescriptionDefault
integrationNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It correctly implies a read-only retrieval, but it does not disclose that the 'integration' parameter is optional (required: 0) or what happens when omitted. It also does not mention potential errors, rate limits, or response size. This is a notable gap for a simple but unverified behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, succinct sentence that is front-loaded with the operation and resource. Every phrase adds value: the integration list, the field names, and the parenthetical clarification. No unnecessary words or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description must fully specify the return contract. It lists the returned categories but omits the response format, the behavior for an omitted parameter, and any error conditions. Combined with the missing usage guidance, an agent has enough to grasp the basic purpose but not enough to confidently call it in all valid states (especially the no-argument case).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema provides only an enum with no description (coverage 0%). The description repeats the enum values and adds context about the returned fields, which helps the agent understand the parameter's purpose. However, it does not explain the optionality of the parameter or how omitting it changes the call, so compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the exact verb ('Get') and resource ('details about a Horizen integration'), lists the valid integration names, and specifies the kinds of details returned (category, status, supported networks, access method, docs paths). This clearly distinguishes it from sibling get_* tools that target chains, bridges, tokens, or contract addresses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus its siblings (get_chain_info, get_bridge_info, get_token_info, etc.). It neither states the selection criteria nor mentions exclusions. An agent would have to infer the appropriate context from sibling names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_stork_feed_idA

Compute the Stork oracle feed ID for an asset (e.g. ETHUSD). Derived via keccak256(assetId). Returns verified flag for known IDs.

ParametersJSON Schema
NameRequiredDescriptionDefault
assetIdYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden, and it adds substantive details: the ID is derived via keccak256(assetId) and only known IDs carry a verified flag. It does not fully define behavior for unknown assets or the exact return shape, so it is strong but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loads the main purpose, and every sentence adds value: purpose/example, derivation method, and return flag. There is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple deterministic compute tool with a single parameter and no output schema, the description covers what the agent needs to invoke it: the input, the derivation, and a key return detail. It could be slightly more explicit about the response format and unknown-asset handling, but the missing information is minor at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the single assetId parameter is meaningfully explained: it is an asset identifier with the example ETHUSD and is fed into keccak256. This compensates for the schema gap for a one-parameter tool, though it stops short of listing supported asset ID values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Compute') and resource ('Stork oracle feed ID for an asset'), with a concrete example (ETHUSD). It is clear, but it does not explicitly contrast itself with sibling tools such as fetch_stork_price, so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended context is implied: use this tool when an asset's Stork feed ID is needed, as opposed to fetching price data. However, the description does not state when-not-to-use or name an alternative, leaving the vs-alternatives guidance implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_token_infoA

Get token addresses and specs for tokens on Horizen: ZEN (governance, 18 decimals), cbBTC (Coinbase Bitcoin, 8 decimals — NOT 18), USDC.e (bridged USDC, 6 decimals). Returns Horizen address plus cross-chain addresses (Base, Base Sepolia). Omit token to list all tokens with their decimals.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenNoToken key: zen (ZEN governance token), cbtc (cbBTC — Coinbase Bitcoin, 8 decimals), usdce (USDC.e — bridged USDC, 6 decimals). Omit to list all tokens.
networkNoWhich network's addresses to return. Defaults to mainnet.mainnet

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses return scope (Horizen address plus Base/Base Sepolia cross-chain addresses), highlights the notable cbBTC decimal pitfall ('8 decimals — NOT 18'), and explains the omit-token behavior. It doesn't cover auth/rate limits, but this is a read-only info tool where that is less critical.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with zero filler: token specs/decimals in sentence one, cross-chain address scope in sentence two, and omit-token behavior in sentence three. The most salient content is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param optional read tool with enums and full schema coverage, the description provides the essential domain facts (decimals, networks, list-all behavior) needed to invoke it correctly. The absence of a precise return format is a minor gap, and no output schema exists to compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters are already documented in the schema with the same token/network details. The description largely restates this, adding minor texture like 'governance' and 'bridged' and re-emphasizing the cbBTC decimal warning. This meets the baseline 3 for high schema coverage but adds little new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific verb ('Get token addresses and specs') and a specific resource ('tokens on Horizen'), enumerating the three supported tokens. It is clearly distinguishable from siblings like get_chain_info or get_contract_address, though it does not explicitly name any alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: use this tool when you need token addresses/specs or want to list all tokens. It provides within-tool guidance (omit token to list all), but gives no explicit when-to-use vs alternatives or exclusions relative to sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_contractsA

List all contracts in the registry with their display names and which networks they are deployed on.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral disclosure burden. It correctly indicates this is a read-only listing of all contracts with specific output fields, but it does not mention pagination, potential response size, or whether any registry census scope is limited. This is minimal but not misleading.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the action, that conveys the tool's purpose and its key output without unnecessary wording. Every part earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with no output schema and no annotations, this description provides enough to know when to call and what will be returned. It lacks minor context like response shape or possible scale of results, but it is reasonably complete for such a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there is nothing for the description to explain. It still hints that the call is unfiltered ('all contracts'), which is useful given the empty parameter schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific action ('List all contracts in the registry'), a clear resource scope, and names the returned fields (display names and deployed networks). This distinguishes it from more targeted siblings like get_contract_address.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit when-to-use or when-not-to-use guidance, and does not mention alternatives like get_contract_address for specific contracts. The word 'list' implies the use case, but there is no direct support for choosing between sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.2.0
    • First observedcheck_zkverify_status
    • First observedfetch_stork_price
    • First observedget_bridge_info
    • First observedget_chain_info
    • First observedget_contract_address
    • First observedget_integration_info
    • First observedget_stork_feed_id
    • First observedget_token_info
    • First observedlist_contracts

TDQS

A4/5.0

Scored across 9 tools

Disambiguation5/5

Each tool targets a clearly distinct resource or action: chain metadata, integration info, contract addresses/registry, Stork feed IDs/prices, bridge info, token specs, and zkVerify proof status. Even related Stork and contract tools are separated cleanly and described without ambiguity.

Naming Consistency5/5

All tool names follow a snake_case action_noun pattern, predominantly get_<entity>_info or get_<entity>_address. The list_, fetch_, and check_ deviations are semantically justified for listing, live API pulls, and verification, so the naming remains predictable and consistent.

Tool Count5/5

With 9 tools, the server is well-scoped for its purpose: chain metadata, integration info, contract registry, bridge info, tokens, Stork oracle, and zkVerify each have a dedicated tool. There is no obvious redundancy or bloat.

Completeness5/5

The surface covers the main Horizen ecosystem information needs: network metadata, registry addresses, token details, bridge info, Stork feed ID/price, and zkVerify verification. It includes multi-network support, explicit not-found semantics, and no obvious dead ends or missing operations.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers