Koskamo

AnvilCalc MCP

A remote MCP server for AnvilCalc that allows AI agents to calculate the exact XP cost and cheapest combine order for Minecraft anvil operations, supporting both Java and Bedrock editions. It provides tools to simulate single anvil steps or find optimal multi-step migration paths for enchantments.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

AnvilCalc MCP logo, by AnvilCalcVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-07Operated by AnvilCalc
MCP endpoint (Streamable HTTP)
https://mcp.anvilcalc.com/mcp
Vendor documentation

What its tools do

2 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

2 of 2 have a description · 0 of 2 declare behavior hints · 0 of 2 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to anvilcalc.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Calculate the cheapest XP cost to combine two enchanted items in a single anvil operation
  • Find the optimal multi-step path to achieve a target enchantment set from a source item
  • Determine if a specific enchantment combination is possible given current inventory constraints

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
anvilcalc-mcp 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
2 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

2 advertised

anvil_combine_cost — Anvil combine cost
Advertised by the server during the last successful anonymous check.

Simulates exactly one Minecraft anvil operation — combining `item` (the base, left slot) with `sacrifice` (the right slot), optionally renaming the result — with no search or planning: it's a direct simulation of that specific in-game anvil use, not a 'find the cheapest way to reach X' query. Returns the XP-level cost, feasibility, and the resulting enchantments. A sacrifice enchantment the base item cannot take (e.g. Efficiency from a book onto a sword) is ignored by the anvil: cost 0, `transferred: false`. For finding the cheapest multi-step path from a current state to a target enchantment set, use anvil_migration_path instead.

anvil_combine_cost input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "item",
    "sacrifice"
  ],
  "properties": {
    "item": {
      "type": "object",
      "required": [
        "id",
        "enchantments"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Item id, e.g. 'diamond_sword', or 'book'/'enchanted_book' for a book"
        },
        "name": {
          "type": "string",
          "description": "This item's existing custom name, if any"
        },
        "material": {
          "type": "string",
          "description": "Optional material override for the item, if applicable"
        },
        "enchantments": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "level"
            ],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Enchantment id, e.g. 'sharpness'"
              },
              "level": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 1,
                "description": "Enchantment level (Roman-numeral level as an integer)"
              }
            }
          },
          "description": "Enchantments currently on this item/book"
        },
        "priorWorkCount": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "This item's own 'too expensive' prior-work counter, if it has already been anvil-combined before (0 if fresh)"
        }
      }
    },
    "edition": {
      "enum": [
        "java",
        "bedrock"
      ],
      "type": "string",
      "description": "Minecraft edition; defaults to 'java'"
    },
    "newName": {
      "type": "string",
      "description": "Desired custom name for the result. A rename is included only if this differs from item.name (use '' to clear an existing name) — cost is a flat +1 XP level, the actual text has no effect on cost. Omit to leave the name untouched."
    },
    "version": {
      "type": "string",
      "description": "Game version, e.g. '1.21.4'; defaults to the latest supported version for the chosen edition"
    },
    "sacrifice": {
      "type": "object",
      "required": [
        "id",
        "enchantments"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Item id, e.g. 'diamond_sword', or 'book'/'enchanted_book' for a book"
        },
        "name": {
          "type": "string",
          "description": "This item's existing custom name, if any"
        },
        "material": {
          "type": "string",
          "description": "Optional material override for the item, if applicable"
        },
        "enchantments": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "level"
            ],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Enchantment id, e.g. 'sharpness'"
              },
              "level": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 1,
                "description": "Enchantment level (Roman-numeral level as an integer)"
              }
            }
          },
          "description": "Enchantments currently on this item/book"
        },
        "priorWorkCount": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "This item's own 'too expensive' prior-work counter, if it has already been anvil-combined before (0 if fresh)"
        }
      }
    }
  }
}
anvil_migration_path — Anvil migration path
Advertised by the server during the last successful anonymous check.

Compute the cheapest Minecraft anvil combine path to migrate an item's existing enchantments (and prior-work penalty count) to a target enchantment set. sourceItem and targetItem must be the same item id (e.g. both 'diamond_sword') — a mismatch is a tool error, not a silent conversion. Inventory usage is set by two optional inputs: with no availableSources the inventory is not used ("Don't use": every needed book/item is assumed obtainable); with availableSources the plan may use them when they help and assumes the rest is obtainable ("May use"); with inventoryOnly: true, which is never implied, only the listed items are considered, lower levels may be combined into higher ones (two same-level books into the next level) but no outside book is ever assumed ("Only use"; a plan the inventory cannot complete comes back as error 'blocked_plan'). Optional `objective`: 'min_xp' (default, fewest XP levels) or 'min_prior_work' (fewest anvil operations on the finished item so it stays cheap to upgrade later, then fewest XP levels); when set, the response also reports the objective used, the total XP and the result's prior-work count. Returns ordered combine steps, per-step and total cost, feasibility, and a plain-language summary. Fails clearly, as a tool error, if the target requires downgrading an enchantment level (not possible on a vanilla anvil).

anvil_migration_path input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "sourceItem",
    "targetItem"
  ],
  "properties": {
    "edition": {
      "enum": [
        "java",
        "bedrock"
      ],
      "type": "string",
      "description": "Minecraft edition; defaults to 'java'"
    },
    "version": {
      "type": "string",
      "description": "Game version, e.g. '1.21.4'; defaults to the latest supported version for the chosen edition"
    },
    "objective": {
      "enum": [
        "min_xp",
        "min_prior_work"
      ],
      "type": "string",
      "description": "What to optimise. 'min_xp' (default) finds the plan with the fewest total XP levels. 'min_prior_work' finds the plan whose FINISHED item has the lowest prior-work count (fewest anvil operations on it, so it stays cheap to upgrade again later — each extra operation doubles the prior-work penalty of any future combine), and among plans with that count picks the cheapest in XP. 'min_prior_work' may cost more XP; when this parameter is given the response also reports the objective used, the total XP and the result's prior-work count so the two modes can be compared. Omit for the original min_xp behaviour and response."
    },
    "sourceItem": {
      "type": "object",
      "required": [
        "id",
        "enchantments"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Item id, e.g. 'diamond_sword' — must match targetItem.id"
        },
        "name": {
          "type": "string",
          "description": "The item's existing custom name, if any"
        },
        "material": {
          "type": "string",
          "description": "Optional material override for the item, if applicable"
        },
        "enchantments": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "level"
            ],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Enchantment id, e.g. 'sharpness'"
              },
              "level": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 1,
                "description": "Enchantment level (Roman-numeral level as an integer)"
              }
            }
          },
          "description": "Enchantments currently on the item"
        },
        "priorWorkCount": {
          "type": "integer",
          "maximum": 9007199254740991,
          "minimum": 0,
          "description": "The item's existing 'too expensive' prior-work-penalty counter, if known"
        }
      }
    },
    "targetItem": {
      "type": "object",
      "required": [
        "id",
        "enchantments"
      ],
      "properties": {
        "id": {
          "type": "string",
          "minLength": 1,
          "description": "Item id, e.g. 'diamond_sword' — must match sourceItem.id, or the tool returns an error"
        },
        "name": {
          "type": "string",
          "description": "Desired custom name. A rename is included only if this differs from sourceItem.name (use '' here to clear an existing name) — cost is a flat +1 XP level, the actual text has no effect on cost. Omit to leave the name untouched."
        },
        "enchantments": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "id",
              "level"
            ],
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Enchantment id, e.g. 'sharpness'"
              },
              "level": {
                "type": "integer",
                "maximum": 9007199254740991,
                "minimum": 1,
                "description": "Enchantment level (Roman-numeral level as an integer)"
              }
            }
          },
          "minItems": 1,
          "description": "Desired final enchantments"
        }
      }
    },
    "inventoryOnly": {
      "type": "boolean",
      "description": "\"Only use\": only if you set this to true (it is never implied, not even when availableSources is non-empty). The plan then considers only the items in availableSources (respecting each one's quantity/unlimited) and never assumes an outside book is obtainable. It may still start by combining lower levels into higher ones, for example two same-level books into the next level. If the inventory cannot reach the target, the result is feasible: false with error 'blocked_plan' (the cheapest plan assuming each missing book, with blockers). Omit it or pass false for the default (\"Don't use\" with no sources, \"May use\" with sources)."
    },
    "availableSources": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "sourceId",
          "isBook",
          "enchantments",
          "priorWorkCount"
        ],
        "properties": {
          "cured": {
            "type": "boolean",
            "description": "Only meaningful when villagerTrade is true: whether that specific villager has been cured, for the discounted emerald price in the plan's emerald-cost estimate. Never affects XP level cost."
          },
          "isBook": {
            "type": "boolean",
            "description": "True if this source is an enchanted book rather than an item"
          },
          "itemId": {
            "type": "string",
            "description": "Item id this source is, e.g. 'diamond_pickaxe' — required when isBook is false"
          },
          "origin": {
            "enum": [
              "enchanting_table",
              "villager_trade",
              "fishing",
              "loot",
              "anvil_combined",
              "other"
            ],
            "type": "string",
            "description": "Informational only — where this source came from"
          },
          "quantity": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 1,
            "description": "How many independent physical copies of this exact source are owned (default 1). Ignored when unlimited is true."
          },
          "sourceId": {
            "type": "string",
            "minLength": 1,
            "description": "Caller-chosen id used to reference this source in the plan output"
          },
          "unlimited": {
            "type": "boolean",
            "description": "True if more of this exact source can always be obtained on demand (e.g. a standing villager trade) — treated as reusable without limit instead of a fixed quantity."
          },
          "enchantments": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "level"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "minLength": 1,
                  "description": "Enchantment id, e.g. 'sharpness'"
                },
                "level": {
                  "type": "integer",
                  "maximum": 9007199254740991,
                  "minimum": 1,
                  "description": "Enchantment level (Roman-numeral level as an integer)"
                }
              }
            },
            "minItems": 1,
            "description": "Enchantments already present on this source"
          },
          "villagerTrade": {
            "type": "boolean",
            "description": "True if this source is a STANDING, repeatable villager trade (not a specific physical copy you already own) — this, not origin, is what makes a source cost emeralds in the plan's emerald-cost estimate. A source you physically own, even one whose origin happens to be tagged 'villager_trade' as a flavor note on how you got it, should leave this false/unset and stays free. Never affects XP level cost."
          },
          "priorWorkCount": {
            "type": "integer",
            "maximum": 9007199254740991,
            "minimum": 0,
            "description": "This source's own 'too expensive' prior-work counter, if it has already been anvil-combined before (0 for a fresh book/item)"
          }
        }
      },
      "description": "The books/items the player already owns, i.e. the inventory. Omit it or pass [] for \"Don't use\": no inventory is provided, so the plan assumes every needed book/item is obtainable (a fresh single-enchantment book for each target enchantment). Pass one or more sources for \"May use\": the plan picks those that make it cheaper, ignores the ones that don't help, and still assumes anything the sources cannot provide is obtainable. Passing sources never implies \"Only use\"; that needs inventoryOnly: true."
    }
  }
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
254 ms
95th percentile latency
254 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 254 ms · metadata changed · 2 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http anvilcalc-mcp https://mcp.anvilcalc.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add anvilcalc-mcp --url https://mcp.anvilcalc.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable anvilcalc-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "anvilcalc-mcp": {
      "url": "https://mcp.anvilcalc.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "anvilcalc-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.anvilcalc.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start anvilcalc-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "anvilcalc-mcp": {
      "type": "http",
      "url": "https://mcp.anvilcalc.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http anvilcalc-mcp https://mcp.anvilcalc.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.anvilcalc.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "anvilcalc-mcp": {
      "serverUrl": "https://mcp.anvilcalc.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like AnvilCalc MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run AnvilCalc MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing