Skip to main content
Glama

Agent Einstein — Crypto & Market Intelligence

Bitcoin On-Chain Cycle

get_bitcoin_cycle_position
Read-onlyIdempotent

Where Bitcoin sits in its cycle by on-chain measures — realized-profit, holder-behaviour and valuation indicators rather than price alone.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
nvtNoNVT ratio. Null when the metric is not in this pass.
mvrvNoMVRV ratio with its cycle signal and 7d trend.
staleNoTrue when the snapshot is past its refresh interval.
reasonNoWhy the payload is absent, when `available` is false.
sourceNoOn-chain data source.
txCountNoTransaction count.
priceUsdNoBTC price, raw and formatted.
txVolumeNoOn-chain transaction volume. Null when not in this pass.
availableNoFalse when this call has no data — a snapshot that is not warm yet, a domain switched off, or an argument that was rejected. NOT an error, and NOT a statement about the market.
fetchedAtNoWhen the underlying snapshot was refreshed (epoch ms or ISO-8601). Age matters: these are cached reads, not live queries.
marketCapNoMarket cap, raw and formatted.
totalFeesNoTotal fees paid.
timeSeriesNoHistory behind the metrics, one point per day.
realizedCapNoRealized cap. Null when not in this pass.
exchangeFlowNoExchange inflow/outflow and the net signal.
minerRevenueNoMiner revenue.
activeAddressesNoActive addresses, with a 7d trend.
dormantSupplyPctNoShare of supply dormant. Null when not in this pass.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / properties / fetchedAt / description
      Previous value: -"When the underlying snapshot was refreshed (epoch ms, or ISO-8601 for the Bitcoin cycle feed). Age matters: these are cached reads, not live queries."New value: +"When the underlying snapshot was refreshed (epoch ms or ISO-8601). Age matters: these are cached reads, not live queries."
  2. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": true,
      +  "properties": {
      +    "activeAddresses": {
      +      "additionalProperties": true,
      +      "description": "Active addresses, with a 7d trend."
      +    },
      +    "available": {
      +      "description": "False when this call has no data — a snapshot that is not warm yet, a domain switched off, or an argument that was rejected. NOT an error, and NOT a statement about the market.",
      +      "type": "boolean"
      +    },
      +    "dormantSupplyPct": {
      +      "additionalProperties": true,
      +      "description": "Share of supply dormant. Null when not in this pass."
      +    },
      +    "exchangeFlow": {
      +      "additionalProperties": true,
      +      "description": "Exchange inflow/outflow and the net signal.",
      +      "properties": {
      +        "inflow": {
      +          "description": "Coins moving to exchanges."
      +        },
      +        "net": {
      +          "description": "Net flow."
      +        },
      +        "outflow": {
      +          "description": "Coins leaving exchanges."
      +        },
      +        "signal": {
      +          "description": "What the net flow implies."
      +        }
      +      }
      +    },
      +    "fetchedAt": {
      +      "description": "When the underlying snapshot was refreshed (epoch ms, or ISO-8601 for the Bitcoin cycle feed). Age matters: these are cached reads, not live queries."
      +    },
      +    "marketCap": {
      +      "additionalProperties": true,
      +      "description": "Market cap, raw and formatted."
      +    },
      +    "minerRevenue": {
      +      "additionalProperties": true,
      +      "description": "Miner revenue."
      +    },
      +    "mvrv": {
      +      "additionalProperties": true,
      +      "description": "MVRV ratio with its cycle signal and 7d trend.",
      +      "properties": {
      +        "signal": {
      +          "description": "What that level has historically meant."
      +        },
      +        "trend7d": {
      +          "description": "Change over 7 days."
      +        },
      +        "value": {
      +          "description": "MVRV ratio."
      +        }
      +      }
      +    },
      +    "nvt": {
      +      "additionalProperties": true,
      +      "description": "NVT ratio. Null when the metric is not in this pass."
      +    },
      +    "priceUsd": {
      +      "additionalProperties": true,
      +      "description": "BTC price, raw and formatted."
      +    },
      +    "realizedCap": {
      +      "additionalProperties": true,
      +      "description": "Realized cap. Null when not in this pass."
      +    },
      +    "reason": {
      +      "description": "Why the payload is absent, when `available` is false.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "description": "On-chain data source."
      +    },
      +    "stale": {
      +      "description": "True when the snapshot is past its refresh interval."
      +    },
      +    "timeSeries": {
      +      "description": "History behind the metrics, one point per day.",
      +      "items": {
      +        "additionalProperties": true,
      +        "properties": {
      +          "activeAddresses": {
      +            "description": "Active addresses at that point."
      +          },
      +          "marketCap": {
      +            "description": "Market cap at that point."
      +          },
      +          "mvrv": {
      +            "description": "MVRV at that point."
      +          },
      +          "time": {
      +            "description": "ISO-8601 timestamp."
      +          },
      +          "txCount": {
      +            "description": "Transactions at that point."
      +          }
      +        }
      +      },
      +      "type": "array"
      +    },
      +    "totalFees": {
      +      "additionalProperties": true,
      +      "description": "Total fees paid."
      +    },
      +    "txCount": {
      +      "additionalProperties": true,
      +      "description": "Transaction count."
      +    },
      +    "txVolume": {
      +      "additionalProperties": true,
      +      "description": "On-chain transaction volume. Null when not in this pass."
      +    }
      +  },
      +  "type": "object"
      +}
  3. Added

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered. The description adds only scope colour (which indicator families feed the result) and nothing about refresh cadence, data recency, or rate limits. With annotations doing the heavy lifting, a 3 is appropriate.

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?

A single well-formed sentence with the purpose front-loaded and the differentiating clause attached via a dash. No filler, though the dash clause packs three concept families into one breath.

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?

With an output schema present and annotations covering behavior, the description only needs to convey scope of purpose, which it does. The remaining gap is routing guidance versus the many analysis siblings, which is a minor omission for a no-parameter read 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 takes zero parameters, so per the rubric the baseline is 4. There is no input surface for the description to clarify.

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 names a specific subject (Bitcoin's cycle position) and the measurement basis (on-chain measures: realized-profit, holder-behaviour, valuation), which tells an agent this is distinct from price-based tools like get_market_sentiment or get_top_movers. It is clear, though it never explicitly names a sibling to contrast against.

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 phrase 'rather than price alone' implicitly signals the condition for choosing this tool over price-only siblings, but there is no explicit when-to-use, when-not-to-use, or named alternative. Usage is implied rather than stated.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.