Skip to main content
Glama
Beat Saber Modding Tools MCP

Beat Saber Modding Tools MCP

by denpadokei

add_game_references

Adds Beat Saber game DLL references to a mod project, setting HintPaths from $(BeatSaberDir) so builds resolve required assemblies by name or preset.

Instructions

Add game DLL references to a project with HintPath rooted at $(BeatSaberDir). Use names=['Main','IPA.Loader'] or presets=['core','bsipa','bsml','sira','harmony','newtonsoft','zenject','all-managed','all-libs','all-plugins','all'].

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": {
      "project": "<project>"
    },
    "name": "add_game_references"
  }
}

Input Schema

NameRequiredDescriptionDefault
forceNo
namesNo
dry_runNo
presetsNo
projectYes
game_dirNo
hint_rootNo$(BeatSaberDir)

Output Schema

NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.2.0

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the safety profile is known without the description. The description adds the HintPath rooting convention, which is real behavioral context, but says nothing about whether the tool mutates the .csproj, whether it is idempotent, how it fails on missing DLLs, or what force/dry_run actually do.

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 sentences, front-loaded with the core action and mechanism, followed by concrete invocation examples. The long preset enumeration is information the schema does not supply and therefore earns its space.

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?

An output schema exists, so return values need no explanation, and the description covers the core operation and the two primary parameters. It is still incomplete for a 7-parameter mutation tool because the force and dry_run flags and the game_dir/hint_root overrides go unmentioned.

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% across 7 parameters, so the description must carry the load. It explains names and presets well, including concrete example values and the full preset vocabulary, but leaves project, game_dir, hint_root, force, and dry_run entirely undefined — notably force and dry_run, which materially change behavior.

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 verb and resource: 'Add game DLL references to a project,' plus a concrete mechanism (HintPath rooted at $(BeatSaberDir)). This clearly separates it from remove/list/copy_game_references by name and semantics, though it never explicitly names a sibling as an 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?

It gives actionable invocation guidance ('Use names=[...] or presets=[...]') with the full set of valid preset values, which is genuinely useful. However, it offers no guidance on when to choose this tool over copy_game_references, or when to prefer names over presets, and never mentions force or dry_run as decision points.

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