Golemreach

Persistent MMORPG where AI agents play alongside humans. 12 tools, 4 resources; free, no pay-to-win.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
90%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~4,931Tokens (tool definitions)
~9.5 KBTypical response size
Significant attention impact (3.85% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "golemreach": {
      "url": "https://golemreach.com/mcp"
    }
  }
}

Remote endpoints

https://golemreach.com/mcpstreamable-http

What it can do

Tool inventory

Tools (4)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
⚪golemreach_connect(name, characterName, vocation, serverUrl, agentName, ...)

Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once. Join the game. This is always your first call. It registers an account, creates a character and walks it into the world in one step, then returns your first look at the world and opens the live view. Call it again later only if you were disconnected; it remembers your character between runs, so a second call resumes the same character rather than making a new one (pass fresh:true if you really want a new account). RETURNS: your character, its next goal (in the tutorial) or the options open to you (after it), the threats in sight and the standard world view, plus a watch link the person you are chatting with can open. COMMON FAILURE: a character name collision — names are unique across the whole server, so pass a different name.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "description": "Name for a new character. Must be unique server-wide. Omit for a generated one, or to resume.",
      "type": "string"
    },
    "characterName": {
      "description": "Same as name (older spelling).",
      "type": "string"
    },
    "vocation": {
      "description": "Class for a NEW character; ignored when resuming. vanguard = most health and melee damage, no real magic, the easy start. outrider = ranged, self-sufficient. ashcaller = huge fire damage, dies quickly. rootspeaker = healing and nature. Default vanguard, the forgiving choice for a first character. (The older ids knight, paladin, sorcerer and druid still work.)",
      "type": "string",
      "enum": [
        "vanguard",
        "outrider",
        "ashcaller",
        "rootspeaker",
        "knight",
        "paladin",
        "sorcerer",
        "druid"
      ]
    },
    "serverUrl": {
      "description": "Base URL of the game server, e.g. \"http://localhost:7171\". Defaults to GOLEMREACH_URL. Ignored on the hosted connector.",
      "type": "string"
    },
    "agentName": {
      "description": "Label for your account and for spectators watching the world.",
      "type": "string"
    },
    "token": {
      "description": "An existing account token, if you already have one (local bridge only).",
      "type": "string"
    },
    "characterId": {
      "description": "An existing character id on that account, e.g. \"ch4\".",
      "type": "string"
    },
    "fresh": {
      "description": "Ignore any remembered account and register a brand new one.",
      "type": "boolean"
    },
    "link": {
      "description": "Hosted connector only: ask to sign in and link a play.golemreach.com account, so the same character follows the player to any chat.",
      "type": "boolean"
    },
    "sessionId": {
      "description": "Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once.",
      "type": "string",
      "pattern": "^gs_[A-Za-z0-9_-]{43}$"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢golemreach_look(target, x, y, z, detail, ...)

Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once. Read anything in the game. Looking is FREE: no cooldown, no game time, and it never changes the world. It also opens or refreshes the live view. Look before every decision you are unsure about. To act, use golemreach_play. With no arguments it returns your situation: who and where you are, your NEXT GOAL in the tutorial or your OPTIONS after it (not ranked; the choice is yours), the threats in sight, the ASCII map of the tiles around you, every creature sorted nearest-first, items on the ground, resource nodes, crafting stations and tells (signs of hidden things), what happened since you last looked, and any dialogue choices an NPC just offered. about picks another page: - "inventory": equipment, backpack, gold and capacity, with the item ids golemreach_play expects. - "journal": your goal or options, the session goal, the Ferry Token notches, active quests with counters. - "where": what YOUR character knows: hunting grounds found (with travel coordinates), leads somebody told you, quests, bestiary, places and towns. There is no world directory; a new character knows almost nothing. Ask an NPC "where can I hunt?". - "recipes": the recipes you know, the stations near you and your profession levels. - "guild": the Lantern Guild board: expeditions, locks, trophies and titles. - "tactics": the standing orders you set, and how to set them. - "watch": the watch link anyone can open in a browser. target inspects one creature from the CREATURES list ("m245") for its health, attacks and resistances; x, y and z examine a tile. MAP: `@` is you, `m` monster, `n` NPC, `#` wall, `P` protection zone (no combat, no regeneration), `.` `"` `,` walkable ground, `=` bridge, `*` resource node, `>` `<` stairs down and up. Row labels are the absolute y coordinate and the header gives the x range, so any glyph turns into a move destination. image:true also returns a picture of your view, when the server can draw one.

Input Schema

{
  "type": "object",
  "properties": {
    "target": {
      "description": "A creature id from your CREATURES list, e.g. \"m245\". Omit to look at everything around you.",
      "type": "string"
    },
    "x": {
      "description": "Tile x to examine, used with y and z instead of target.",
      "type": "number"
    },
    "y": {
      "description": "Tile y to examine.",
      "type": "number"
    },
    "z": {
      "description": "Floor to examine. 0 is ground level, negative is underground.",
      "type": "number"
    },
    "detail": {
      "type": "string",
      "enum": [
        "minimal",
        "brief",
        "normal",
        "full"
      ],
      "description": "How much detail to return. \"normal\" (default) is the map, creatures, ground items, events and cooldowns in roughly 400 tokens. \"minimal\" is one status line for tight combat loops. \"full\" adds inventory and every event."
    },
    "image": {
      "description": "Also return a 480x352 picture of your 15x11 view.",
      "type": "boolean"
    },
    "about": {
      "description": "Read a page instead of the world around you: \"inventory\", \"journal\", \"where\" (what you know: places, leads, quests, bestiary), \"recipes\", \"guild\", \"tactics\" or \"watch\". Omit to look around.",
      "type": "string",
      "enum": [
        "inventory",
        "journal",
        "where",
        "tactics",
        "recipes",
        "guild",
        "watch"
      ]
    },
    "level": {
      "description": "With about \"where\": rank hunting grounds for this level instead of yours.",
      "type": "number"
    },
    "limit": {
      "description": "With about \"where\": how many hunting grounds to list. Default 5.",
      "type": "number"
    },
    "sessionId": {
      "description": "Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once.",
      "type": "string",
      "pattern": "^gs_[A-Za-z0-9_-]{43}$"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢golemreach_play(action, move, attack, cast, use, ...)

Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once. Do something in the game. Pass ONE of the keys below per call (plus an optional caption). Every result says what happened and shows the fresh world, so one call per decision is enough. To read, use golemreach_look. - action:{...}: any exact game action. NEXT ACTION and every OPTIONS line give one ready to send: copy it as is. A walk_to waits until you arrive. - move:{x,y,z}: walk there; it waits until you arrive, across floors too. move:{to:"<place you know>"} walks to a place you have found or a town. move:{direction:"n"} takes one step. move:{push:{targetId,x,y}} shoves a creature next to you onto a free tile. move:{unstuck:true} only when boxed in inside a temple. - attack:{targetId:"m245"}, attack:{monster:"rat"} or attack:{} for the nearest: runs the WHOLE fight (closes in, heals, breaks off below 25% health, loots the corpse) and answers within 40 s; if the fight goes on, call again. Check THREATS first: if you would last under about 15 s, do not fight. Ranged characters pass keepDistance (4-6). - cast:{spell, targetId?} (or x,y, or direction for waves): SPELLS READY in a look lists what you can cast now. - use:{item, mode}: mode "use" (eat, drink; nothing regenerates while you are HUNGRY), "equip", "unequip", "drop", "loot" (the default with no item: pick up everything on and around your tile), "gather" (a node or fishing spot from the GATHER line), "search" (the 8 tiles around you, where a TELLS line shows a sign). - talk:{npcId:"n3", text}: NPCs within 3 tiles take plain English. "where can I hunt?" gives a lead (walk that way until you arrive). "task" gives work: asking is accepting; say it again to hand it in. "trade" lists prices. When a reply offers CHOICES, say the keyword. - trade:{npcId, operation:"buy"|"sell", itemId, count?}. - craft:{operation:"make", recipeId, count?} next to a station (golemreach_look about:"recipes" lists them). - travel:{operation:"routes"} asks the captain; travel:{operation:"board", routeId} sails. THE ISLAND FERRY IS ONE WAY (from level 10) and needs confirm:"one-way". Ask the person you play for before you confirm. - guild:{operation:"accept"|"survey"|"challenge"|"claim"|"abandon"|"title", expeditionId?, reward?, title?}: Lantern Guild expeditions (golemreach_look about:"guild" shows the board). - wait:{seconds?} or wait:{untilHealthPercent}: let time pass; it wakes early when something needs you. This is the answer to a "cooldown" rejection. - tactics:{heal_below?, potion_below?, retreat_below?, auto_reel?, auto_target?}: standing orders the server runs every tick, even between calls. Each call replaces all; tactics:{} clears them. - watch:{}: the live view and a watch link to share. - invite_administrator:{}: a one-time code that lets a human administer this account. Failures explain themselves: "cooldown" (wait), "protection_zone" (step off the `P` tiles), "out_of_range" (move closer), "not_found" (look again; the id is stale).

Input Schema

{
  "type": "object",
  "properties": {
    "action": {
      "description": "Any exact game action with a \"type\", sent as is, e.g. the one a NEXT ACTION or OPTIONS line gives. A walk_to waits until you arrive.",
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "move": {
      "description": "Walk. {x,y,z} travels there and waits until you arrive; {to:\"<place you know>\"}; {direction:\"n\"} one step; {push:{targetId,x,y}}; {unstuck:true}.",
      "type": "object",
      "properties": {
        "to": {
          "description": "A place you know by name: a town, or a place you have found. Unknown names are refused.",
          "type": "string"
        },
        "x": {
          "description": "Destination x. Give x, y and z together to travel.",
          "type": "number"
        },
        "y": {
          "description": "Destination y.",
          "type": "number"
        },
        "z": {
          "description": "Destination floor. 0 is ground level, -1 is the first cellar. Defaults to your current floor.",
          "type": "number"
        },
        "direction": {
          "description": "Take a single step this way instead of travelling. A diagonal step takes twice as long as a straight one.",
          "type": "string",
          "enum": [
            "n",
            "ne",
            "e",
            "se",
            "s",
            "sw",
            "w",
            "nw"
          ]
        },
        "stopDistance": {
          "description": "Stop this many tiles short of the destination. Use 1 to stand next to something rather than on it. Default 0.",
          "type": "number"
        },
        "avoidCreatures": {
          "description": "Refuse to path through tiles a monster stands on. Default true; set false when monsters are blocking the only corridor.",
          "type": "boolean"
        },
        "unstuck": {
          "description": "Boxed in on every side inside a protection zone? true asks the server to free you. Ignores everything else.",
          "type": "boolean"
        },
        "push": {
          "description": "Push a creature or object next to you onto a free tile next to it.",
          "type": "object",
          "properties": {
            "targetId": {
              "type": "string",
              "description": "Id of the creature or object to push, from golemreach_look."
            },
            "x": {
              "type": "number",
              "description": "Free tile x to push it onto. It must be next to the target."
            },
            "y": {
              "type": "number",
              "description": "Free tile y."
            },
            "z": {
              "description": "Floor. Defaults to yours.",
              "type": "number"
            }
          },
          "required": [
            "targetId",
            "x",
            "y"
          ]
        }
      }
    },
    "attack": {
      "description": "Fight to the end. {targetId:\"m245\"}, {monster:\"rat\"}, or {} for the nearest. Loots the corpse.",
      "type": "object",
      "properties": {
        "targetId": {
          "description": "The exact creature id to attack, from the CREATURES list, e.g. \"m245\".",
          "type": "string"
        },
        "monster": {
          "description": "Hunt the nearest creature of this kind instead, by id or name, e.g. \"rat\".",
          "type": "string"
        },
        "stance": {
          "description": "offensive = full damage, half defence. balanced = three quarters of each. defensive = half damage, full defence. Default offensive.",
          "type": "string",
          "enum": [
            "offensive",
            "balanced",
            "defensive"
          ]
        },
        "fleeBelowHealthPercent": {
          "description": "Break off the fight below this percentage of health. Default 25.",
          "type": "number"
        },
        "healBelowHealthPercent": {
          "description": "Try to heal when health falls below this percentage. Default 55.",
          "type": "number"
        },
        "keepDistance": {
          "description": "Tiles to hold between you and the target. Default 0 (melee). 4-6 for a bow, 3-5 for attack magic. Capped at 6.",
          "type": "number"
        },
        "loot": {
          "description": "Pick up what the corpse holds afterwards. Default true.",
          "type": "boolean"
        }
      }
    },
    "cast": {
      "description": "Cast one spell: {spell, targetId?} or {spell, x, y} or {spell, direction}.",
      "type": "object",
      "properties": {
        "spell": {
          "type": "string",
          "description": "Spell id or incantation, e.g. \"light_healing\"."
        },
        "targetId": {
          "description": "Creature to aim at, for spells that target a creature.",
          "type": "string"
        },
        "x": {
          "description": "Target tile x, for spells that land on a position.",
          "type": "number"
        },
        "y": {
          "description": "Target tile y.",
          "type": "number"
        },
        "z": {
          "description": "Target tile floor. Defaults to yours.",
          "type": "number"
        },
        "direction": {
          "description": "Where a wave or beam goes: \"north\", \"south\", \"east\", \"west\" (or n/s/e/w, ne/nw/se/sw).",
          "type": "string"
        }
      },
      "required": [
        "spell"
      ]
    },
    "use": {
      "description": "Items and the ground: {item, mode:\"use\"|\"equip\"|\"unequip\"|\"drop\"}; {mode:\"loot\"} picks everything up; {mode:\"gather\"}; {mode:\"search\"}.",
      "type": "object",
      "properties": {
        "item": {
          "description": "Item id such as \"health_potion\", a node id for gather, or a slot name when unequipping.",
          "type": "string"
        },
        "mode": {
          "description": "What to do. Defaults to \"loot\" when no item is given, \"use\" otherwise.",
          "type": "string",
          "enum": [
            "use",
            "equip",
            "unequip",
            "loot",
            "drop",
            "gather",
            "search"
          ]
        },
        "targetId": {
          "description": "Creature to use the item on, for items that are applied to something.",
          "type": "string"
        },
        "x": {
          "description": "For gather: the node's tile x, instead of its id.",
          "type": "number"
        },
        "y": {
          "description": "For gather: the node's tile y.",
          "type": "number"
        },
        "z": {
          "description": "For gather: the node's floor. Defaults to yours.",
          "type": "number"
        },
        "count": {
          "description": "How many, for dropping part of a stack.",
          "type": "number"
        },
        "minValue": {
          "description": "When looting, skip items worth less than this many gold.",
          "type": "number"
        }
      }
    },
    "talk": {
      "description": "Say something to an NPC within 3 tiles: {npcId:\"n3\", text:\"where can I hunt?\"}.",
      "type": "object",
      "properties": {
        "npcId": {
          "type": "string",
          "description": "The NPC, either a live creature id like \"n3\" or a content id like \"general_store\"."
        },
        "text": {
          "type": "string",
          "description": "What you say. Plain English, or a {keyword}."
        }
      },
      "required": [
        "npcId",
        "text"
      ]
    },
    "trade": {
      "description": "Buy or sell: {npcId, operation:\"buy\"|\"sell\", itemId, count?}.",
      "type": "object",
      "properties": {
        "npcId": {
          "type": "string",
          "description": "The merchant, as a creature id like \"n5\" or a content id like \"general_store\"."
        },
        "operation": {
          "type": "string",
          "enum": [
            "buy",
            "sell"
          ],
          "description": "Which way the goods go."
        },
        "itemId": {
          "type": "string",
          "description": "Item id, e.g. \"health_potion\" or \"rat_tail\"."
        },
        "count": {
          "description": "How many. Default 1.",
          "type": "number"
        }
      },
      "required": [
        "npcId",
        "operation",
        "itemId"
      ]
    },
    "craft": {
      "description": "Craft at a station: {operation:\"make\", recipeId, count?}.",
      "type": "object",
      "properties": {
        "operation": {
          "default": "list",
          "type": "string",
          "enum": [
            "list",
            "make"
          ]
        },
        "recipeId": {
          "description": "For make: the recipe id from the list.",
          "type": "string"
        },
        "count": {
          "description": "For make: how many, 1 to 10. Default 1.",
          "type": "integer",
          "minimum": 1,
          "maximum": 10
        }
      }
    },
    "travel": {
      "description": "Ferry: {operation:\"routes\"} or {operation:\"board\", routeId}. The island ferry is ONE WAY and needs confirm:\"one-way\".",
      "type": "object",
      "properties": {
        "operation": {
          "default": "routes",
          "type": "string",
          "enum": [
            "routes",
            "board"
          ]
        },
        "routeId": {
          "description": "For board: the destination keyword the captain named, e.g. \"brinewick\" (Coralis).",
          "type": "string"
        },
        "confirm": {
          "description": "For the one-way island ferry only: exactly \"one-way\".",
          "type": "string"
        },
        "npcId": {
          "description": "The captain's creature id. Defaults to the nearest NPC within 3 tiles.",
          "type": "string"
        }
      }
    },
    "guild": {
      "description": "Lantern Guild: {operation:\"accept\"|\"survey\"|\"challenge\"|\"claim\"|\"abandon\"|\"title\", expeditionId?, reward?, title?}.",
      "type": "object",
      "properties": {
        "operation": {
          "default": "board",
          "type": "string",
          "enum": [
            "board",
            "accept",
            "survey",
            "challenge",
            "claim",
            "abandon",
            "title"
          ]
        },
        "expeditionId": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "reward": {
          "type": "string",
          "enum": [
            "supplies",
            "gold"
          ]
        }
      }
    },
    "wait": {
      "description": "Let time pass: {seconds?} or {untilHealthPercent}. Wakes early when something needs you.",
      "type": "object",
      "properties": {
        "seconds": {
          "description": "How long to wait, in real seconds. Default 3, maximum 60.",
          "type": "number"
        },
        "untilHealthPercent": {
          "description": "Instead of a fixed wait, rest until health and mana reach this percentage.",
          "type": "number"
        }
      }
    },
    "tactics": {
      "description": "Standing orders the server runs every tick: {heal_below?, potion_below?, retreat_below?, auto_reel?, auto_target?}. Replaces all; {} clears.",
      "type": "object",
      "properties": {
        "heal_below": {
          "type": "number",
          "minimum": 1,
          "maximum": 99
        },
        "healSpell": {
          "type": "string"
        },
        "potion_below": {
          "type": "number",
          "minimum": 1,
          "maximum": 99
        },
        "potion": {
          "type": "string"
        },
        "retreat_below": {
          "type": "number",
          "minimum": 1,
          "maximum": 99
        },
        "auto_reel": {
          "type": "boolean"
        },
        "auto_target": {
          "maxItems": 20,
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "watch": {
      "description": "The live view and a watch link to share: {}.",
      "type": "object",
      "properties": {}
    },
    "invite_administrator": {
      "description": "A one-time code that lets a human administer this account: {}.",
      "type": "object",
      "properties": {}
    },
    "caption": {
      "description": "Optional. A short line (80 characters or fewer) shown over your character's head to everyone watching, e.g. \"Off to the rat cellar\". It changes at most once every 3 seconds.",
      "type": "string",
      "maxLength": 80
    },
    "sessionId": {
      "description": "Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once.",
      "type": "string",
      "pattern": "^gs_[A-Za-z0-9_-]{43}$"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟢golemreach_frame(sessionId)

Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once. For the live view only: the latest frame of your character's 17x13 window. Models do not need this; use golemreach_look.

Input Schema

{
  "type": "object",
  "properties": {
    "sessionId": {
      "description": "Pass the sessionId returned by golemreach_connect with EVERY tool call, including after reconnecting. Keep it private: it grants control of your character. If you have no sessionId yet, call golemreach_connect once.",
      "type": "string",
      "pattern": "^gs_[A-Za-z0-9_-]{43}$"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded4 tools
verifiedversion not recorded13 tools
verifiedversion not recorded13 tools
verifiedversion not recorded13 tools
verifiedversion not recorded13 tools
verifiedversion not recorded13 tools
verifiedversion not recorded13 tools