Skip to content

Conversation

@triepod-ai
Copy link
Contributor

@triepod-ai triepod-ai commented Jan 19, 2026

Summary

Adds Model Context Protocol Bundle (MCPB) support enabling single-click installation in Claude Desktop and other MCP hosts.

Changes

  • Added manifest.json with uvx-based server configuration (downloads from PyPI)
  • Added icon.png (Coplay avatar)
  • Added .mcpbignore for build exclusions
  • Added pre-built unity-mcp.mcpb bundle for direct installation

What is MCPB?

MCPB (MCP Bundle) is a packaging format that enables easy distribution of MCP servers. Similar to browser extensions (.crx) or VS Code extensions (.vsix), users can install the server with a single click.

Testing

  • Bundle validates successfully (mcpb validate)
  • Bundle packs successfully (mcpb pack)
  • Tested installation in Claude Desktop
  • Server connects to Unity Editor
  • All 29 tools functional (tested: console, scene hierarchy, asset search, test runner)

Installation

Download the unity-mcp.mcpb file and double-click to install in Claude Desktop.

Note: Requires the Unity MCP plugin installed in Unity Editor (see README for setup).

Building the Bundle

If you prefer to build from source:

npx @anthropic-ai/mcpb pack .

🤖 Generated with Claude Code

Summary by Sourcery

Add MCP bundle metadata for the Unity MCP server to support installation via MCP hosts.

New Features:

  • Introduce an MCP manifest describing the Unity MCP server, its Python entrypoint, and its MCP tool capabilities for distribution as a bundle.

Enhancements:

  • Add MCP bundle ignore configuration to control which files are included when packaging the Unity MCP server.

Summary by CodeRabbit

  • New Features

    • Added a manifest that registers a Unity MCP extension with metadata, runtime server configuration, and a catalog of automation tools.
    • Added a CLI utility to build MCP bundle packages and an automated release job to generate and publish those bundles.
  • Chores

    • Added an ignore manifest to exclude unnecessary project files and artifacts from packaging.

✏️ Tip: You can customize this high-level summary in your review settings.

Add Model Context Protocol Bundle (MCPB) support enabling single-click
installation in Claude Desktop and other MCP hosts.

Changes:
- Add manifest.json with uvx-based server configuration
- Add icon.png for display in Claude Desktop
- Add .mcpbignore for build exclusions
- Add pre-built unity-mcp.mcpb bundle

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Jan 19, 2026

Reviewer's Guide

Adds a Model Context Protocol Bundle (MCPB) manifest and related packaging files so the Unity MCP server can be installed as a one-click bundle in Claude Desktop and other MCP hosts, using an uvx-based Python server entrypoint and enumerating all available tools.

Sequence diagram for MCPB-based Unity MCP installation and launch

sequenceDiagram
  actor User
  participant ClaudeDesktop
  participant MCPBundle
  participant MCPServerPython
  participant PyPI
  participant UnityEditor

  User->>ClaudeDesktop: double_click unity_mcp_mcpb
  ClaudeDesktop->>MCPBundle: read manifest_json
  MCPBundle-->>ClaudeDesktop: server_config(type_python, entry_point, uvx_command)
  ClaudeDesktop->>ClaudeDesktop: register tools_from_manifest

  User->>ClaudeDesktop: select Unity_MCP_server
  ClaudeDesktop->>MCPServerPython: launch uvx --from mcpforunityserver mcp_for_unity
  MCPServerPython->>PyPI: download mcpforunityserver (if_needed)
  PyPI-->>MCPServerPython: package_files
  MCPServerPython->>UnityEditor: connect_via_Unity_MCP_plugin
  UnityEditor-->>MCPServerPython: connection_ready
  MCPServerPython-->>ClaudeDesktop: mcp_server_ready_with_29_tools

  User->>ClaudeDesktop: invoke_tool manage_gameobject
  ClaudeDesktop->>MCPServerPython: mcp_tool_request manage_gameobject
  MCPServerPython->>UnityEditor: apply_gameobject_operation
  UnityEditor-->>MCPServerPython: operation_result
  MCPServerPython-->>ClaudeDesktop: tool_response
  ClaudeDesktop-->>User: show_result
Loading

File-Level Changes

Change Details Files
Introduce MCPB manifest describing the Unity MCP server, its installation method, and exposed tools for Claude Desktop and other MCP hosts.
  • Define bundle metadata including name, version, description, author, repository, homepage, documentation, and support URLs.
  • Configure the server section to use a Python entry point with an uvx-based command that installs and runs the server from the mcpforunityserver PyPI package.
  • Declare icon path and enumerate all exposed MCP tools with stable names and descriptions for host-side discovery.
manifest.json
Add MCPB packaging ignore file to control what is included in the built bundle.
  • Create an .mcpbignore file (currently empty in the diff) as a placeholder for excluding build artifacts or unnecessary files from the MCP bundle.
.mcpbignore
Add bundle assets for direct installation and packaging (icon and prebuilt .mcpb).
  • Add an icon asset referenced by the manifest to brand the bundle in MCP hosts.
  • Include a prebuilt unity-mcp.mcpb bundle to allow direct double-click installation without requiring local build steps.
icon.png
unity-mcp.mcpb

Possibly linked issues

  • #MCP server running but tools not injected into conversations (Claude Desktop v1.0.2339): PR adds an MCPB bundle/manifest so Claude Desktop recognizes unityMCP as an installed extension and exposes tools.

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 19, 2026

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

Adds MCPB packaging support: a new .mcpbignore, a manifest.json describing the Unity MCP and tools, a tools/generate_mcpb.py utility to build MCPB bundles, and a GitHub Actions publish_mcpb job to generate and upload the MCPB to releases.

Changes

Cohort / File(s) Summary
Packaging ignore
\.mcpbignore``
New ignore manifest listing paths/globs to exclude sources, TestProjects, docs, tooling, Docker artifacts, Python caches/venvs, env files, git metadata, package lock files, and logs from MCPB packaging.
Extension manifest
\manifest.json``
New Unity MCP manifest: metadata (manifest_version, name, version, author, repo, homepage, docs, icon), server config (type: python, entry_point: Server/src/main.py, mcp_config command/args/env), and a catalog of ~28 tools (name + description).
MCPB build tool
\tools/generate_mcpb.py``
New Python CLI exposing create_manifest, generate_mcpb, and main; assembles temporary build context (injects version & icon, optional LICENSE/README), invokes npx @anthropic-ai/mcpb pack, validates output, and writes unity-mcp-<version>.mcpb.
Release workflow
\.github/workflows/release.yml``
Adds publish_mcpb job: runs on ubuntu-latest, checks out the bumped tag, sets up Node.js & Python, runs the MCPB generator with new_version, and uploads unity-mcp-<version>.mcpb to the GitHub release.

Sequence Diagram(s)

sequenceDiagram
  participant Dev as Developer/Tag
  participant GH as GitHub Actions (runner)
  participant Gen as tools/generate_mcpb.py
  participant NPX as npx (`@anthropic-ai/mcpb`)
  participant Release as GitHub Release

  Dev->>GH: push tag / trigger release workflow
  GH->>GH: checkout tag\nsetup-node (v20)\nsetup-python (3.11)
  GH->>Gen: run generate_mcpb.py --version <tag> --icon <icon>
  Gen->>Gen: create build context\nwrite manifest.json\ncopy icon/LICENSE/README
  Gen->>NPX: run `npx `@anthropic-ai/mcpb` pack` on build context
  NPX-->>Gen: produce `unity-mcp-<version>.mcpb`
  Gen-->>GH: return MCPB path
  GH->>Release: upload `unity-mcp-<version>.mcpb`
  Release-->>Dev: MCPB artifact available
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • CI Updates #536 — Modifies the release workflow with additional publish jobs; closely related to the publish_mcpb job addition here.

Suggested reviewers

  • msanatan

Poem

🐰 I hopped through manifests, tidy and spry,
Ignored the crumbs that would slow our sky-high,
I packed an icon, README, and cheer,
Pushed a shiny bundle for everyone near —
Hooray! A rabbit-built MCPB is here! 🥕

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ❓ Inconclusive Description provides comprehensive details but does not follow the repository's template structure with required sections. Restructure description to match template: add 'Type of Change' section, clearly label 'Changes Made', and organize 'Testing' per template format.
✅ Passed checks (1 passed)
Check name Status Explanation
Title check ✅ Passed Title clearly summarizes the main change: adding MCPB bundle support for Claude Desktop installation.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue, and left some high level feedback:

  • The server.entry_point is set to Server/src/main.py while the actual launch is handled via uvx in mcp_config; if the entry point is unused for this server type, consider either aligning it with the real module or omitting it to avoid confusion for future maintainers.
  • The .mcpbignore file is currently empty; consider explicitly ignoring the generated .mcpb bundle and any build or tooling artifacts (e.g., node_modules, .venv, caches) to keep bundles minimal and reproducible.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `server.entry_point` is set to `Server/src/main.py` while the actual launch is handled via `uvx` in `mcp_config`; if the entry point is unused for this server type, consider either aligning it with the real module or omitting it to avoid confusion for future maintainers.
- The `.mcpbignore` file is currently empty; consider explicitly ignoring the generated `.mcpb` bundle and any build or tooling artifacts (e.g., `node_modules`, `.venv`, caches) to keep bundles minimal and reproducible.

## Individual Comments

### Comment 1
<location> `manifest.json:20-23` </location>
<code_context>
+  "icon": "icon.png",
+  "server": {
+    "type": "python",
+    "entry_point": "Server/src/main.py",
+    "mcp_config": {
+      "command": "uvx",
+      "args": ["--from", "mcpforunityserver", "mcp-for-unity"],
+      "env": {}
+    }
</code_context>

<issue_to_address>
**issue (bug_risk):** Clarify whether the server should be launched via entry_point or mcp_config to avoid conflicting definitions.

The manifest defines both a Python `entry_point` and an `mcp_config` using `uvx`, which may cause different hosts to choose different startup paths. Decide which mechanism should be canonical and remove the other to avoid inconsistent behavior across MCP clients.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +20 to +23
"entry_point": "Server/src/main.py",
"mcp_config": {
"command": "uvx",
"args": ["--from", "mcpforunityserver", "mcp-for-unity"],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Clarify whether the server should be launched via entry_point or mcp_config to avoid conflicting definitions.

The manifest defines both a Python entry_point and an mcp_config using uvx, which may cause different hosts to choose different startup paths. Decide which mechanism should be canonical and remove the other to avoid inconsistent behavior across MCP clients.

@msanatan
Copy link
Member

Thanks @triepod-ai, I might merge this in soon.

We should also update release.yml to automatically bump the version. I can add it if you're unable to get to it

@msanatan
Copy link
Member

Thinking a bit more, the bundle updates every version. I think this is better suited as a release artifact than something that lives and is updated in the repo.

@msanatan
Copy link
Member

Hey @triepod-ai, can you change this so the MCPB is NOT added to the repo, but generated on each release?

Something like this:

release.yml:

- name: Generate MCPB bundle
  env:
    NEW_VERSION: ${{ steps.compute.outputs.new_version }}
  shell: bash
  run: |
    set -euo pipefail
    python3 tools/generate_mcpb.py "$NEW_VERSION" \
      --output "unity-mcp-${NEW_VERSION}.mcpb" \
      --icon docs/images/coplay-logo.png

- name: Create GitHub release
  uses: softprops/action-gh-release@v2
  with:
    tag_name: ${{ steps.tag.outputs.tag }}
    name: ${{ steps.tag.outputs.tag }}
    generate_release_notes: true
    files: |
      unity-mcp-${{ steps.compute.outputs.new_version }}.mcpb

Do you have a nice way to keep all the tools updated?

Address review feedback from @msanatan:
- Remove pre-built unity-mcp.mcpb and icon.png from repository
- Add tools/generate_mcpb.py script for bundle generation
- Update release.yml with new publish_mcpb job that:
  - Generates bundle using generate_mcpb.py
  - Uploads MCPB file as release artifact
- Update manifest.json to reference icon from docs/images/

The bundle is now generated automatically on each release,
keeping the repository clean while providing download artifacts.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@triepod-ai
Copy link
Contributor Author

Thanks for the feedback @msanatan! You're right - having the bundle as a release artifact is much cleaner.

I've updated the PR with the following changes:

Changes Made

  1. Removed from repo:

    • unity-mcp.mcpb - pre-built bundle
    • icon.png - duplicate icon (using docs/images/coplay-logo.png instead)
  2. Added tools/generate_mcpb.py - Script to generate the MCPB bundle:

    python3 tools/generate_mcpb.py 9.0.8 \
      --output unity-mcp-9.0.8.mcpb \
      --icon docs/images/coplay-logo.png
  3. Updated release.yml - New publish_mcpb job that:

    • Runs after the bump job
    • Generates the MCPB bundle using generate_mcpb.py
    • Uploads it as a release artifact via softprops/action-gh-release@v2
  4. Updated manifest.json - Icon path now references coplay-logo.png (copied from docs/images during bundle generation)

Regarding Tool Sync

The tools list in manifest.json is currently static. The generate script reads the manifest template, so if you add/remove tools in the server, you'll need to manually update manifest.json to keep them in sync.

If you'd prefer automatic tool discovery, we could enhance the script to query the server's tools/list response, but that would require the server to be running during bundle generation.

Let me know if you'd like any adjustments!

The mcpb CLI uses 'mcpb pack [directory] [output]' syntax,
not '--output' flag. Tested locally - bundle generates correctly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
@triepod-ai
Copy link
Contributor Author

Tested the generate script locally - it works! Bundle installs and loads correctly in Claude Desktop (Windows).

Ready for review when you have a chance.

@triepod-ai
Copy link
Contributor Author

triepod-ai commented Jan 22, 2026

@msanatan I would encourage you to consider submitting it to the official anthropic directory (https://www.anthropic.com/engineering/desktop-extensions).

@dsarno
Copy link
Collaborator

dsarno commented Jan 22, 2026

Hi Bryan, we'll definitely put it in the directory!

Separately, do you know if Anthropic has any grant programs that support open source projects with token credits? We use Claude code extensively to develop this project, and to make it Claude-friendly, and have spent thousands of dollars on tokens for it, much of it (like me) out of our own pockets. We'd love to count Anthropic as a supporter and collaborator in that way as we grow and reach people all over the world. Let me know if we could send a short proposal about it. Thanks!

@msanatan msanatan changed the base branch from main to beta January 22, 2026 19:20
Copy link
Member

@msanatan msanatan left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Things to do post-merge:

  • Auto update version of manifest.json
    • Can improve version bump with a separate script
  • Put a reminder in developer docs to update this when tools are updated
    • I think we can probably do this by analyzing Python code, but I won't expend that effort right now

@msanatan msanatan merged commit 1238eb1 into CoplayDev:beta Jan 22, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants