Patina Unity MCP
Patina Unity MCP lets you control the Unity Editor directly from any MCP-compatible AI assistant via three core tools that expose 86 Unity commands.
Core MCP Tools
patina_capabilities– Browse and search the Unity command catalog by category, name, or keyword; optionally fetch parameter schemas before calling a commandpatina_call– Execute any of the 86 cataloged Unity commands with JSON parameterspatina_health– Check server version, bridge port, command count, and optionally query live Unity editor state
What You Can Do (via patina_call)
Scene Management – Get hierarchy, open/save/create scenes, query scene info and stats
GameObject Operations – Create primitives, delete, duplicate, reparent, show/hide, set tags/layers/transforms
Components & Properties – Add/remove components, read/write serialized properties
Batch Operations – Apply transform changes, property edits, or component additions to multiple GameObjects at once
Prefabs – Create, instantiate, inspect, unpack, apply/revert overrides, edit prefab assets
Assets – Find by type or name, get metadata, create folders, move/rename/delete assets, refresh the Asset Database, set labels
Materials – Create materials, read/write shader properties, assign materials to renderers
Scripts – Create C# scripts, read script content, trigger recompilation, get compiler errors
Scriptable Objects – Read and write serialized fields on ScriptableObject assets
Search & Query – Find GameObjects by tag, component, layer, hierarchy path, or compound filters
Console – Log messages, read buffered console entries, clear the console
Editor Control – Get editor state, read project settings, enter/exit/pause play mode, execute menu items, manage selection
Undo/Redo – Open/close undo groups, perform undo/redo steps, inspect the undo stack
Build & Player Settings – Read/write build settings, scene list, player settings, and switch build targets
Test Runner – Run Unity tests, retrieve results, list available tests
Animation – Inspect Animator controllers, set parameters at runtime, list animation clips
Validation – Scan scenes and assets for missing scripts, broken references, and null serialized fields
Controls the Unity Editor by providing tools for scene management, GameObject manipulation, asset operations, script handling, and more, allowing AI agents to interact with Unity directly.
Patina
Control the Unity Editor from any MCP host. One package install, one click, and your AI assistant can see your scene, create objects, and talk to the console.
Patina is a Rust MCP server paired with a C# Unity bridge. It connects your favorite AI coding tool directly to the Unity Editor over a local TCP channel, with zero manual config.
Why Patina?
One-click setup. Install the UPM package, click a button, and every supported host is configured automatically.
No Rust required. Release packages ship pre-built binaries for Windows, Linux, and macOS. Just install and go.
Built for speed. The Rust sidecar keeps the MCP layer fast and lightweight while Unity stays on the main thread.
Multi-host. Works with Claude Code, Cursor, VS Code, Gemini CLI, JetBrains Rider, Codex CLI, and more.
Related MCP server: Unity-MCP-Vibe
How It Works
MCP Host <-- stdio --> Patina Server <-- local TCP --> Unity EditorThe host launches the Rust binary over stdio MCP. The Rust server forwards tool calls into Unity through a local loopback TCP bridge. Unity executes them on the main thread and returns the result.
Quick Start
1. Install the Unity package
In Unity, open Project Settings > Package Manager, add a scoped registry, then install the package by name.
Scoped registry:
Field | Value |
Name |
|
URL |
|
Scope(s) |
|
Then open the Package Manager (Window > Package Manager), click the + icon in the top left, select Add package by name..., and enter:
com.taygunsavas.patina-unity-mcpRegistry releases are signed during the release workflow for Unity Package Manager verification.
Alternatively, open the Package Manager, click the + icon, select Add package from git URL..., and enter:
https://github.com/taygunsavas/patina-unity-mcp.git?path=/unity-packagePatina is distributed as a complete Unity package artifact with the editor code, native Rust runtime binaries under Plugins/<platform>/, and the Unity metadata needed for import. End users do not need the Rust toolchain or a Git checkout of this repository.
2. Run One-Click Setup
Open Window > Patina Unity MCP and click One-Click Setup.
The setup flow verifies the binary, starts the Unity bridge, auto-configures every detected host, replaces stale entries, and shows restart guidance where needed.
Patina writes host configs to a stable user-level runtime path instead of a per-project Unity package cache path. When the package is updated, the Unity editor package refreshes that managed runtime automatically, so supported MCP hosts do not need to be reconfigured just because the package cache path changed.
3. Start building
Open your MCP host and try:
"Log hello to Unity console"
"Show me the scene hierarchy"
"Create a cube at position 0, 2, 0"
Available Capabilities
Patina keeps the advertised MCP surface compact so hosts do not need to load every Unity command schema into context. Agents should use:
MCP tool | What it does |
| Search or browse the Unity command catalog; request schemas only for specific commands |
| Execute a catalog command with JSON parameters |
| Inspect Patina version, command count, bridge port, optional Unity editor state, and bridge diagnostics |
The 87 commands below are available through patina_capabilities and patina_call.
Scene
Tool | What it does |
| Retrieve the active scene's GameObject tree as nested JSON; supports |
| Active scene metadata (name, path, build index, root count, dirty state); pass |
| Open a scene by project-relative path; |
| Save the active scene or any loaded scene; supports Save As |
| Create and save a new scene with optional empty or default-game-objects setup |
GameObjects
Tool | What it does |
| Spawn an empty GameObject or a built-in primitive (Cube, Sphere, Capsule, Cylinder, Plane, Quad) |
| Permanently delete a GameObject and all its children |
| Duplicate a GameObject and its children |
| Move a GameObject under a new parent; pass |
| Full details for a named GameObject: transform, tag, layer, and all component properties |
| Show or hide a GameObject via |
| Set the tag on a GameObject (tag must be registered in Tags & Layers) |
| Set the layer by name; optionally apply to all children |
| Set position, rotation (Euler), and/or scale in world or local space in one call |
Components & Properties
Tool | What it does |
| Add a component by short name ( |
| Remove a component by type name |
| Set any serialized property on a component using its SerializedObject path |
| Return a lightweight component list for a GameObject |
Batch Operations
Tool | What it does |
| Apply serialized property changes across multiple GameObjects |
| Add components to multiple GameObjects |
| Apply transform changes to multiple GameObjects |
Prefabs
Tool | What it does |
| Save a scene GameObject as a prefab asset |
| Instantiate a prefab into the scene at an optional world position |
| Inspect a prefab asset or scene instance; returns asset type, overrides list, and instance status |
| Sever a prefab instance link; |
| Apply all instance overrides back to the source prefab asset on disk |
| Restore a prefab instance to match its source asset |
| List component types and instance IDs on a prefab asset; optionally includes child GameObjects with transform paths |
| Perform a batch of edit operations (add/remove component, add/remove child, set field) on a prefab asset, including object-reference fields |
| Open a prefab asset in Unity's prefab stage for editing; exit using |
| Close the active prefab stage; |
Example: Set a component reference within a prefab.
To point a serialized field at another component inside the same prefab, pass an edit_prefab_asset action with set_field and an object reference value. The transform_path inside value is resolved against the prefab root, not against the action's own transform_path:
{
"asset_path": "Assets/Prefabs/MyPrefab.prefab",
"actions": [
{
"action_type": "set_field",
"component_type": "MyNamespace.MyComponent",
"field_name": "targetReference",
"value": {"transform_path": "Container/Button", "component_type": "MyNamespace.TargetComponent"}
}
]
}Assets
Tool | What it does |
| Search the Asset Database by type filter ( |
| Search the Asset Database by partial name match |
| Metadata for an asset: GUID, type, file size, labels, and importer settings |
| Create a new folder in the Asset Database |
| Move an asset to a new project-relative path |
| Rename an asset in-place |
| Delete an asset by project-relative path |
| Trigger |
| Replace the full label list on an asset |
Materials
Tool | What it does |
| Create a new Material asset; defaults to URP/Lit |
| Read all exposed shader properties with names, types, and current values |
| Set a shader property (float, bool, color, vector, or texture path) |
| Assign a Material to a specific Renderer slot |
Scripts
Tool | What it does |
| Create a new C# script from a template ( |
| Resolve a MonoScript GUID and asset path by its fully qualified C# type |
| Trigger a Unity script recompile via |
| Trigger script recompile and return compiler errors only; also returns |
| Get the list of current compiler errors and warnings |
| Read the content of a script file in the project |
| List all types declared in a specific assembly |
| Request a domain reload via |
Scriptable Objects
Tool | What it does |
| Read serialized fields from a ScriptableObject asset |
| Set one serialized ScriptableObject field |
Validation & Health
Tool | What it does |
| Scan the active scene for quality issues (missing script references, null serialized fields, and broken prefab connections) |
| Validate a single prefab asset or a folder recursively for missing scripts, broken object references, and unassigned required serialized fields |
| Return lightweight statistics for the active scene (object count, component count, unique type counts, max depth, etc.) |
Search & Query
Tool | What it does |
| Find all active GameObjects with a given tag |
| Find all scene objects that have a given component type |
| Find all scene objects on a given layer by name |
| Find GameObjects matching compound filters |
| Find GameObjects by hierarchy path prefix |
Console
Tool | What it does |
| Emit a message to the Unity Console ( |
| Read buffered console entries with per-entry |
| Clear all console log entries |
Editor State & Control
Tool | What it does |
| Current editor flags and main-thread responsiveness; returns a limited blocked state with |
| Read-only snapshot of key project settings (version, build target, color space, physics gravity, etc.) |
| Enter, exit, pause, unpause, or step play mode |
| Execute any Editor menu item by full path (e.g. |
| Return the current Editor selection (scene objects and/or asset paths) |
| Set the Editor selection to specific GameObjects and/or asset paths |
Undo
Tool | What it does |
| Open a named Unity Undo group |
| Collapse operations into the current Undo group |
| Perform one or more Undo steps |
| Perform one or more Redo steps |
| Return current Undo and Redo stack entry names |
Build & Player Settings
Tool | What it does |
| Build Settings snapshot: active target, scripting backend, and full scene list |
| Replace the Build Settings scene list with an ordered list of scene paths |
| Read Player Settings for a build target group (Standalone, Android, iOS, WebGL) |
| Write Player Settings fields; only non-null fields are changed |
| Switch the active build target (blocks the main thread on large projects) |
Test Runner
Tool | What it does |
| Start a Unity Test Runner execution |
| Return results from the most recent test run |
| List available Unity tests |
Animation
Tool | What it does |
| Read Animator Controller parameters and state information |
| Set an Animator parameter in play mode |
| List AnimationClip assets in the project |
Supported Hosts
Host | Setup |
Antigravity CLI (agy) | Automatic |
Claude Code (Anthropic CLI) | Automatic ( |
Claude Desktop | Automatic |
Cursor | Automatic |
Visual Studio Code | Automatic |
GitHub Copilot (VS Code) | Linked via VS Code config |
Gemini CLI | Automatic |
JetBrains Rider / Junie | Automatic |
Codex CLI | Automatic |
The setup window also detects stale entries, missing hosts, and provides a clean Remove Patina From Hosts action.
Troubleshooting
If a Patina call reports EDITOR_BLOCKED, or mentions that Unity may be waiting on a modal dialog, check the Unity Editor for a save-changes prompt or other blocking popup. Patina cannot safely run queued editor commands while Unity is waiting for user input. Resolve the Unity prompt, then retry the MCP command or run patina_health with {"include_unity_state": true}.
Prefab Stage Save Dialogs
Patina addresses dirty prefab stages by responding to the save question programmatically rather than blocking on a modal. When you call close_prefab_stage, the save_changes parameter directly determines the outcome: true saves, false (default) discards changes. This applies only to that command call and does not alter Editor behavior when a human is working manually.
Once a modal dialog appears, Unity's main thread is blocked and remains blocked until a human closes it. Every queued command processes through the same blocked thread, so prevention is the only real solution. For agent-written editor scripts, the safe pattern is to write prefabs using PrefabUtility.LoadPrefabContents, apply changes to a SerializedObject, save with PrefabUtility.SaveAsPrefabAsset, then PrefabUtility.UnloadPrefabContents. This approach never opens a prefab stage. If a stage must be opened, close it with close_prefab_stage. Leaving a dirty stage and manually calling StageUtility.GoToMainStage() will lock the Editor.
Unity offers a startup flag, -automated, which disables dialogs process-wide. While this may be suitable for an Editor driven entirely by agents, it creates problems in hybrid workflows where a human and agent share the same Editor: unsaved changes trigger no prompts, and some operations silently cancel. Patina does not require -automated. Per-command dialog answering works reliably without it and behaves correctly even in an Editor opened with -automated.
To check the current Editor state and dialog automation status, call patina_health and examine broker.sessions[].automated in the default output, or isAutomatedMode and dialogAutomationAvailable when passing {"include_unity_state": true}.
Roadmap
Phase | Focus |
Phase 1 ✓ | Core tools: console, hierarchy, object creation |
Phase 2 ✓ | Expanded coverage: scene management, asset operations, component editing |
Phase 3 (current) | Distribution and reach: Git URL installation docs, package layout, release pipeline |
Local Development
Contributor source checkout
Use this when you are editing unity-package/ or rust-server/ directly from the repository:
Point Unity at the local package checkout.
file:<your-clone-path>/unity-package
Build the Rust server.
cd rust-server && cargo build --releasePublish the current binary into the local development runtime path.
# Windows
pwsh -File scripts/publish-dev-runtime.ps1# macOS / Linux
./scripts/publish-dev-runtime.shIn Unity, open Window > Patina Unity MCP, enable Use Local Runtime (Contributor), and click One-Click Setup.
This writes host configs against the local dev runtime instead of the managed packaged runtime. Re-run One-Click Setup after every new cargo build --release + publish-dev-runtime pass, and use Remove Patina From Hosts before switching back to the packaged flow.
Stage a local UPM test package
Use this when you want to test the package as it will be published, not the raw source checkout:
pwsh -File scripts/stage-local-upm.ps1Then add the staged package from disk in Unity:
dist/local-upm/com.taygunsavas.patina-unity-mcp/package.json
Prefer the staged local package when you are validating package layout, import behavior, or release packaging. Prefer the source checkout path when you are actively editing source and want the fastest edit-build-run loop.
See CONTRIBUTING.md for the full contributor workflow.
Community and Contributing
Start with CONTRIBUTING.md for the local development loop, validation expectations, and pull request guidance.
Use GitHub issue forms for reproducible bugs, feature proposals, and usage questions so maintainers get the context they need.
Read .github/SUPPORT.md before opening a help request.
Read .github/SECURITY.md for private vulnerability reporting.
Read .github/CODE_OF_CONDUCT.md before participating in issues and pull requests.
Pull requests targeting
mainare expected to pass CI and go through CODEOWNERS + Copilot review once repository rules are enabled.
Requirements
Unity 6 (6000.3 LTS+)
A supported MCP host
Rust 1.75+ (contributors only)
License
Available Tools
4 toolspatina_callA
Execute an internal Patina Unity command. Targets the agent working-directory workspace by default; pass workspace to target a different project, or sessionId (from patina_sessions) to target one editor directly.
| Name | Required | Description | Default |
|---|---|---|---|
| command | Yes | Internal Patina command name returned by patina_capabilities. | |
| sessionId | No | Optional exact Unity session ID from patina_sessions. Sufficient on its own -- the default workspace is not applied as a constraint. Required when one workspace has multiple open editors. | |
| workspace | No | Canonical absolute path to the Unity project root. Omit to fall back to this MCP process working directory, which applies only when sessionId is also omitted; supplied together with sessionId, both must resolve to the same session. | |
| parameters | No | JSON parameters for the command. Pass {} (or omit) for commands with no parameters. A JSON-object-encoded string (e.g. "{\"x\":1}") is also accepted and parsed; null or an empty/whitespace string is treated as {}. Any other type (number, bool, array, non-object string) is rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the targeting precedence (default working-directory workspace, overridden by workspace or sessionId, with the constraint about both resolving to same session if provided together). However, it gives no information about side effects, permissions, rate limits, or error behavior of executing commands. With no annotations provided, the description carries the full burden but does not address these important behavioral aspects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose, and includes only essential targeting details. No redundant or fluff content. Each sentence contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's generic nature (executes arbitrary commands) and the absence of an output schema, the description is somewhat under-specified regarding return values and command-specific behavior. It relies on the schema to mention patina_capabilities for command names, but does not explain how outputs are returned or what errors might look like. The targeting info is complete, but broader operational context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds context to workspace and sessionId parameters by explaining their targeting roles, but the schema already provides detailed descriptions for all four parameters (100% coverage). The reference to patina_sessions in the description is helpful but marginal. Baseline 3 is appropriate since the schema carries the main semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool executes an internal Patina Unity command, which distinguishes it from sibling tools like patina_capabilities (listing commands) and patina_sessions (listing sessions). It also specifies targeting scope (default workspace, alternative workspace, or sessionId). The verb 'Execute' and resource 'Patina Unity command' make the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the default workspace versus specifying a different project via workspace or targeting a specific editor via sessionId. It references patina_sessions as the source for session IDs, which orients the agent to the sibling tool. However, it does not explicitly mention patina_capabilities for command discovery, though that is stated in the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patina_capabilitiesA
Browse Patina's Unity command catalog without loading every command schema. Filter by category/search/command; set include_schema=true only for commands you intend to call.
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | Optional text search over command names, categories, and descriptions. | |
| command | No | Optional exact command name. Use with include_schema=true before calling patina_call. | |
| category | No | Optional exact category filter, e.g. "prefab", "asset", "scene", "script", or "validation". | |
| include_schema | No | Include JSON parameter schema for returned commands. Defaults to false to keep context small. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description must carry the full burden of behavioral disclosure. It states that the tool avoids loading every schema (implying lightweight read operation), but omits other behavioral traits such as auth requirements, rate limits, pagination, or response format. This is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary purpose, and every word serves a clear function. There is no redundancy or extraneous information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that there is no output schema and no annotations, the description leaves some gaps: the expected return format (list of commands? with which fields?) is not mentioned, nor is there any indication of pagination or ordering. The description is functional for basic use but could be more complete to fully inform the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, but the description adds value beyond the schema by explaining when to use include_schema (only for intended calls) and its default behavior (false to keep context small). The other parameters are simply listed without additional context, but the general advice on usage is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a command catalog browser with filtering capabilities, and distinguishes it from sibling tools (patina_call, patina_health) by focusing on discovery without loading schemas. The verb 'Browse' combined with the resource 'command catalog' makes the purpose specific and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool (browsing the catalog) and when to set include_schema=true (only for commands to be called). It implicitly distinguishes from patina_call, but could be more explicit about when to skip this tool and directly use patina_call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patina_healthA
Return Patina server version, compact MCP surface status, bridge port, command count, and a broker summary (agentClientCount, unitySessionCount counting both connected and reloading sessions, reloadingSessionCount, and per-session detail). Pass include_unity_state=true to prove the routed Unity session is actually responding, not just registered.
| Name | Required | Description | Default |
|---|---|---|---|
| include_unity_state | No | When true, also calls Unity get_editor_state through the bridge. | |
| include_bridge_diagnostics | No | When true, calls Unity's bridge-level ping without touching Unity main-thread APIs. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose useful behavioral traits: 'unitySessionCount counting both connected and reloading sessions' clarifies a counting nuance, and the include_unity_state semantics explains what that parameter actually verifies. It does not mention permissions or side effects, but this is a read-only health check and the provided detail is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the action verb 'Return'. It lists multiple return elements without excessive padding. It is a bit long, but every clause contributes specific information, maintaining good conciseness despite the technical list.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, so the description must explain return values, which it does by listing categories and exact field names. It also gives a practical usage scenario for a key parameter. It omits detailed description of include_bridge_diagnostics, but the schema covers it, and the overall picture is sufficiently complete for a health-monitoring tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters (100% coverage), so the baseline is 3. The description adds meaningful extra semantics for include_unity_state by explaining it proves the Unity session 'is actually responding, not just registered.' It does not add detail for include_bridge_diagnostics, but the schema covers its behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Return' and enumerates specific resource outputs (server version, MCP surface status, bridge port, command count, broker summary), making the tool's purpose clear. It is distinct from sibling tools like patina_capabilities or patina_sessions by focusing on health/status metrics.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a conditional usage hint for include_unity_state=true ('to prove the routed Unity session is actually responding'), which gives some context. However, it does not explicitly state when to use this tool versus alternatives or mention any exclusions or non-use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
patina_sessionsA
List active Unity sessions registered with the shared Patina broker, including workspace paths, health, state (connected|reloading|stale), and reloadCount. Check state="reloading" before assuming a failed call means Unity disconnected -- it may just be recompiling.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses output fields and a valuable behavioral nuance (reloading state can explain failed calls). It does not explicitly state read-only or auth requirements, but for a list operation the key behaviors are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, directly front-loaded with the purpose, and includes only high-value details like the state values and the reloading caveat. No filler or unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool, the description fully covers what the tool does, what fields are returned, and a useful operational tip. No output schema exists, but the description compensates by enumerating the response contents. No gaps are apparent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, and the schema is empty with 100% code coverage. The baseline for no parameters is 4, and the description adds meaningful context about the data returned, which is more than sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and identifies the exact resource ('active Unity sessions registered with the shared Patina broker') and the key fields returned. This clearly distinguishes it from sibling tools like patina_health (health check) and patina_call (invoking actions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on when to consult this tool, especially the guidance to check state="reloading" before assuming Unity disconnected. While it does not explicitly name alternative tools, the context is sufficient for an agent to decide when this listing is relevant.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
3 tool updates
v1.1.15- Added
patina_call - Changed
patina_health1 field changed- added
Input schema / properties / include_bridge_diagnosticsAdded value: +{ + "description": "When true, calls Unity's bridge-level ping without touching Unity main-thread APIs.", + "type": [ + "boolean", + "null" + ] +}
- Added
patina_sessions
1 tool update
v1.1.7- Removed
patina_call
3 tool updates
v1.1.6- First observed
patina_call - First observed
patina_capabilities - First observed
patina_health
TDQS
Scored across 4 tools
Each tool addresses a clearly distinct concern: command discovery, health status, session listing, and command execution. There is no overlap in purpose, and the descriptions reinforce their unique roles.
All tools share a consistent 'patina_' prefix with simple, readable names. 'call' is slightly verb-like compared to the noun-style others, but the overall pattern remains obvious and predictable.
Four tools is well-scoped for a bridge server that provides capability discovery, health checks, session monitoring, and command execution. Each tool earns its place without unnecessary bloat.
The toolset covers the complete workflow for this domain: discover available commands, check server health, list Unity sessions, and execute commands. No significant gaps are apparent for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Connect AI agents to Flato's editable canvas runtime through a hosted MCP server.
Generate game-ready 3D models, textures, and audio from natural language, over MCP.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceControl Unity Editor from AI agents. 200+ MCP tools for GameObjects, Scenes, Assets, Materials, Prefabs, Terrain, Physics, Lighting, and more. Works with Claude, Cursor, Windsurf, VS Code Copilot — any MCP client. Zero config: just npx and go.6213MIT
- FlicenseNot gradedqualityDmaintenanceA native C# MCP server that gives AI agents real-time control and visual analysis of the Unity Editor, enabling dynamic code execution, scene manipulation, and debugging without external dependencies.6-

glade-mcpofficial
AlicenseNot gradedqualityAmaintenanceConnect any MCP-compatible AI client (Claude Code, Cursor, Windsurf) to Unity or Godot. 300+ granular tools, an editor aware system prompt, game design document project context, script semantic search, and skill calibration.205MIT- FlicenseNot gradedqualityCmaintenanceAn in-editor MCP server that exposes Unity convenience tools to AI assistants, allowing them to read console logs, execute menu items, dump scene hierarchies, and take screenshots.-
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/taygunsavas/patina-unity-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server