Skip to main content
Glama
Keel — Hyperliquid trading strategies

Keel — Hyperliquid trading strategies

by keel-trade

Fork Strategy

keel_strategy_fork

Copy a strategy into your organization as an independent strategy with its own history; the original stays unchanged. Accepts a strategy ID or share-link ID.

Instructions

Copy a strategy into the caller's org as a separate strategy with its own history; the original's source and versions are unchanged (saving a new version of a strategy is keel_strategy_compose). The copy starts with one version and no backtests; the original keeps its versions and their backtests. source is a strategy id (str_*) or the id in a usekeel.io/share/<id> URL showing its source, any organisation's; forking one adds to its public fork count. Sharing is keel_share_create.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "source": "<source>"
    },
    "name": "keel_strategy_fork"
  }
}

Input Schema

NameRequiredDescriptionDefault
nameNoOptional new name for the fork. It names the strategy — its market, thesis or method (e.g. `HYPE MACD trend`) — and is shown wherever the strategy is listed; the user's own name or account belongs to the account, not to a strategy name.
sourceYesStrategy id (`str_*`) or share-link id (the token in a `usekeel.io/share/<id>` URL).
presentNoHow this result displays in the chat — presentation only, no effect on what the tool does. `view`: the full card, for showing the result in full or enlarged. `receipt`: a compact one-line summary row, for the one-line or short version. Omitted: `view`.
descriptionNoThe fork's thesis in the user's own words — one or two sentences on what this copy is for and what it changes (not a transcript of the conversation). Shown on the strategy page in the Keel app, where the user can edit it.
target_workspace_idNoWorkspace to place the fork in (default: org default); it must belong to the caller's org, and the result's `workspace_id` names where the fork landed.

Output Schema

NameRequiredDescriptionDefault
codeNo
costNo
infoNo
modeNo
nameNo
nextNo
slugNo
viewNoOne strategy: its structure graph, change marks, evidence and the rendered markdown.
addedNo
errorNo
quotaNo
ref_aNo
ref_bNo
staleNo
detailNo
parentNo
reasonNo
resumeNo
run_idNo
sourceNo
changedNo
dry_runNo
exampleNo
messageNo
removedNo
versionNo
categoryNo
compiledNo
docs_urlNo
headlineNo
hero_urlNo
metadataNo
universeNo
url_lineNo
variantsNo
versionsNo
exit_codeNo
fork_noteNo
referenceNoBTC hold, price only, over the run's span (run 1's on a comparison).
reorderedNo
retryableNo
risk_bandNo
share_urlNo
sync_noteNo
unchangedNo
action_urlNo
data_as_ofNo
limit_viewNo
validationNo
variant_idNo
recent_runsNoThe strategy's newest backtest runs, newest first (up to 5): run_id, status, version, the version's commit message, window, completed_at and the headline metrics.
source_slugNo
strategy_idNo
declarationsNo
head_summaryNo
new_sequenceNo
quota_noticeNo
resource_uriNo
source_errorNo
summary_textNo
compile_errorNo
entry_versionNo
error_messageNo
library_factsNo
limit_detailsNo
new_commit_idNo
blocked_actionNo
required_actorNo
talking_pointsNo
versions_errorNo
workspace_syncNo
backtest_windowNo
missing_evidenceNo
ownership_statusNo
unavailable_codeNo
description_errorNo
restored_from_refNo
what_was_expectedNo
default_variant_idNo
is_default_variantNo
unavailable_reasonNo
projection_availableNo
suggested_next_actionNo
ownership_resource_uriNo
restored_from_sequenceNo
live_readiness_blockersNo
next_recommended_actionNo
component_version_changesNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed99 schema fields changedv0.9.0
    • addedInput schema / properties / description
      Added value: +{
      +  "description": "The fork's thesis in the user's own words — one or two sentences on what this copy is for and what it changes (not a transcript of the conversation). Shown on the strategy page in the Keel app, where the user can edit it.",
      +  "maxLength": 2000,
      +  "type": "string"
      +}
    • changedInput schema / properties / name / description
      Previous value: -"Optional new name for the fork."New value: +"Optional new name for the fork. It names the strategy — its market, thesis or method (e.g. `HYPE MACD trend`) — and is shown wherever the strategy is listed; the user's own name or account belongs to the account, not to a strategy name."
    • addedInput schema / properties / name / maxLength
      Added value: +255
    • addedInput schema / properties / name / minLength
      Added value: +1
    • addedInput schema / properties / present
      Added value: +{
      +  "description": "How this result displays in the chat — presentation only, no effect on what the tool does. `view`: the full card, for showing the result in full or enlarged. `receipt`: a compact one-line summary row, for the one-line or short version. Omitted: `view`.",
      +  "enum": [
      +    "receipt",
      +    "view"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / source / description
      Previous value: -"Strategy id (`str_*`) or share-link id."New value: +"Strategy id (`str_*`) or share-link id (the token in a `usekeel.io/share/<id>` URL)."
    • changedInput schema / properties / target_workspace_id / description
      Previous value: -"Workspace to place the fork in (default: org default)."New value: +"Workspace to place the fork in (default: org default); it must belong to the caller's org, and the result's `workspace_id` names where the fork landed."
    • addedOutput schema / description
      Added value: +"A strategy result: `view` renders it; an error carries `code` and `message` instead."
    • addedOutput schema / properties / action_url
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / added
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / backtest_window
      Added value: +{}
    • addedOutput schema / properties / blocked_action
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / category
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / changed
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / code
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / compile_error
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / compiled
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / component_version_changes
      Added value: +{}
    • addedOutput schema / properties / cost
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / data_as_of
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / declarations
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / default_variant_id
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / description_error
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / detail
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / docs_url
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / dry_run
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / entry_version
      Added value: +{}
    • addedOutput schema / properties / error
      Added value: +{}
    • addedOutput schema / properties / error_message
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / example
      Added value: +{}
    • addedOutput schema / properties / exit_code
      Added value: +{
      +  "type": "integer"
      +}
    • addedOutput schema / properties / fork_note
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / head_summary
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / headline
      Added value: +{}
    • addedOutput schema / properties / hero_url
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / info
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / is_default_variant
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / library_facts
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / limit_details
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / limit_view
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / live_readiness_blockers
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / message
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / metadata
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / missing_evidence
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / mode
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / name
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / new_commit_id
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / new_sequence
      Added value: +{
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / next
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / next_recommended_action
      Added value: +{}
    • addedOutput schema / properties / ownership_resource_uri
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / ownership_status
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / parent
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / projection_available
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / quota
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / quota_notice
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / reason
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / recent_runs
      Added value: +{
      +  "description": "The strategy's newest backtest runs, newest first (up to 5): run_id, status, version, the version's commit message, window, completed_at and the headline metrics.",
      +  "items": {
      +    "properties": {
      +      "completed_at": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "message": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "metrics": {
      +        "type": "object"
      +      },
      +      "run_id": {
      +        "type": "string"
      +      },
      +      "status": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "version": {
      +        "type": [
      +          "integer",
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "window": {
      +        "type": "object"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / ref_a
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / ref_b
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / reference
      Added value: +{
      +  "description": "BTC hold, price only, over the run's span (run 1's on a comparison).",
      +  "properties": {
      +    "basis": {
      +      "type": "string"
      +    },
      +    "dd_pct": {
      +      "maximum": 0,
      +      "type": "number"
      +    },
      +    "label": {
      +      "type": "string"
      +    },
      +    "ret_pct": {
      +      "type": "number"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedOutput schema / properties / removed
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / reordered
      Added value: +{}
    • addedOutput schema / properties / required_actor
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / resource_uri
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / restored_from_ref
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / restored_from_sequence
      Added value: +{
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • removedOutput schema / properties / result
      Removed value: -{
      -  "type": "string"
      -}
    • addedOutput schema / properties / resume
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / retryable
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / risk_band
      Added value: +{}
    • addedOutput schema / properties / run_id
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / share_url
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / slug
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / source
      Added value: +{}
    • addedOutput schema / properties / source_error
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / source_slug
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / stale
      Added value: +{
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / strategy_id
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / suggested_next_action
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / summary_text
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / sync_note
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / talking_points
      Added value: +{
      +  "type": "array"
      +}
    • addedOutput schema / properties / unavailable_code
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / unavailable_reason
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / unchanged
      Added value: +{
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / universe
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / url_line
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / validation
      Added value: +{
      +  "type": "object"
      +}
    • addedOutput schema / properties / variant_id
      Added value: +{
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / variants
      Added value: +{}
    • addedOutput schema / properties / version
      Added value: +{
      +  "type": [
      +    "integer",
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / versions
      Added value: +{}
    • addedOutput schema / properties / versions_error
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / view
      Added value: +{
      +  "description": "One strategy: its structure graph, change marks, evidence and the rendered markdown.",
      +  "properties": {
      +    "at": {
      +      "type": "string"
      +    },
      +    "categories": {},
      +    "change": {},
      +    "error": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "evidence": {},
      +    "head_version": {
      +      "type": [
      +        "integer",
      +        "null"
      +      ]
      +    },
      +    "header": {},
      +    "kind": {
      +      "const": "strategy"
      +    },
      +    "markdown": {
      +      "type": "string"
      +    },
      +    "marks": {
      +      "type": "boolean"
      +    },
      +    "name": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "object": {
      +      "type": "string"
      +    },
      +    "parse_error": {
      +      "type": "boolean"
      +    },
      +    "previous_version": {},
      +    "seq": {
      +      "type": "integer"
      +    },
      +    "size": {
      +      "type": "string"
      +    },
      +    "source": {},
      +    "status": {},
      +    "status_text": {},
      +    "structure": {},
      +    "url_line": {
      +      "type": "string"
      +    },
      +    "validation": {},
      +    "version": {
      +      "type": [
      +        "integer",
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "required": [
      +    "markdown"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / what_was_expected
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / workspace_sync
      Added value: +{
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "result"
      -]
    • removedOutput schema / x-fastmcp-wrap-result
      Removed value: -true
  2. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

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

Annotations only say this is a non-readonly, open-world, non-idempotent, non-destructive write. The description adds real behavioral context beyond that: the original stays unchanged, the copy begins with one version and no backtests, the original retains its versions and backtests, and forking a shared strategy increments its public fork count. This is exactly the kind of disclosure the annotations cannot carry, and it is consistent with destructiveHint=false.

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 dense but front-loaded, leading with the core copy semantics before parenthetical sibling routing. Every clause carries information (copy state, original state, source formats, fork count), though the parenthetical alternative mentions make the first sentence slightly overloaded.

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?

With annotations, a full output schema, and 100% schema coverage, the remaining burden on the description is to explain what happens on invocation and how it differs from neighbors, which it does thoroughly. Nothing an agent needs to call it correctly (source format, copy vs original state, alternatives) 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 already 100%, so the schema documents each parameter's type, bounds, and enum. The description still adds meaning beyond the schema by spelling out that `source` accepts a `str_*` id or a share-link token from any organisation, and by explaining what forking a shared source does. It does not add much for `name`, `present`, `description`, or `target_workspace_id`, which the schema already covers.

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 (copy/fork a strategy into the caller's org as a separate strategy with its own history) and explicitly contrasts with two siblings: `keel_strategy_compose` for saving a new version and `keel_share_create` for sharing. An agent can distinguish fork from compose/share without opening either schema.

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?

Names the alternative operations and the conditions that select them (saving a new version is compose; sharing is share_create), and clarifies that `source` may be any organisation's share link. It stops short of an explicit 'use this when you want your own editable copy' trigger, so a 4 rather than 5.

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