Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
59c95eb
Added development plan
madsiberian Feb 17, 2026
2d6edce
feat: Add embedded MCP server plugin to Game Studio (Milestone 1.1)
madsiberian Feb 17, 2026
2c0a0a1
feat: Add query_assets, get_scene_tree, get_entity MCP tools (Milesto…
madsiberian Feb 18, 2026
3ba8f6f
fix: MCP: GetEditorStatusTool.GetEditorStatus: Renamed 'projectName' …
madsiberian Feb 18, 2026
811864b
test: Add MCP integration tests (disabled by default)
madsiberian Feb 18, 2026
a31532a
docs: Add MCP plugin README with setup and testing instructions
madsiberian Feb 18, 2026
f4f5013
test: Add bootstrap script and auto-launch fixture for MCP integratio…
madsiberian Feb 18, 2026
8a61d8c
feat: Add open_scene, select_entity, focus_entity MCP tools (Mileston…
madsiberian Feb 19, 2026
5993a83
feat: Add create_entity, delete_entity, reparent_entity, set_transfor…
madsiberian Feb 21, 2026
ad07d65
feat: Add modify_component MCP tool for component add/remove/update
madsiberian Feb 21, 2026
75d9aad
feat: Add build_project, get_build_status MCP tools and integration t…
madsiberian Feb 21, 2026
95b7368
feat: Add capture_viewport MCP tool for viewport screenshot capture
madsiberian Feb 21, 2026
33c9ff8
feat: Add asset management MCP tools and shared JsonTypeConverter
madsiberian Feb 22, 2026
67d6215
fix: Update save_project description and move to its own README section
madsiberian Feb 22, 2026
deae561
feat: Add asset reference support, reload tools, and improved MCP gui…
madsiberian Feb 22, 2026
5ff292d
feat: Add UI page, sprite sheet, and active project MCP tools
madsiberian Feb 23, 2026
28a00df
feat: Extend capture_viewport to UI pages and add open_ui_page tool
madsiberian Feb 23, 2026
22d88fc
feat: Add polymorphic property support to MCP server
madsiberian Feb 24, 2026
52596c8
feat: Add root assets management and improve project selection UX
madsiberian Feb 24, 2026
9904958
Add game-runtime MCP server (Stride.Engine.Mcp) with integration tests
madsiberian Feb 28, 2026
90bbd3b
feat: Add UFile and UDirectory support to MCP property converter
madsiberian Mar 13, 2026
eadfae9
feat: Complete type coverage in MCP JSON property converter
madsiberian Mar 13, 2026
4ba9055
Merge branch 'claude/recursing-bartik' into feature/mcp
madsiberian Mar 13, 2026
361a268
feat: Add describe_viewport tool to both editor and game-runtime MCP …
madsiberian Mar 13, 2026
6e5eaeb
feat: Add navigate_viewport tool and enhance editor MCP tools
madsiberian Mar 13, 2026
ed77d13
feat: Add source file import support to create_asset tool
madsiberian Mar 14, 2026
6f6c4fe
feat: Add reimport action to manage_asset tool
madsiberian Mar 14, 2026
23879aa
fix: Use AssemblyRegistry-based type discovery for component resolution
madsiberian Mar 14, 2026
527690c
feat: Add reload_assemblies tool for loading updated game scripts
madsiberian Mar 14, 2026
3e278e4
refactor: Rename reload_project to restart_game_studio
madsiberian Mar 14, 2026
1f49876
fix: Auto-save before build and clarify save_project description
madsiberian Mar 14, 2026
23ef63c
fix: Serialize asset reference properties via AttachedReferenceManager
madsiberian Mar 14, 2026
116e0fb
fix: Align game-runtime entity serializer with editor MCP
madsiberian Mar 14, 2026
f3ad757
feat: Add MCP server settings and multi-instance support
madsiberian Mar 14, 2026
de038ee
refactor: Move MCP settings from global EditorSettings to per-project…
madsiberian Mar 15, 2026
8f698cc
refactor: Move MCP config from .sdpkg.user to .stride/mcp.json at sol…
madsiberian Mar 15, 2026
ce3de1f
test: Verify .stride/mcp.json runtime info is written on startup
madsiberian Mar 15, 2026
8e5e9fe
fix: Create default .stride/mcp.json on every editor launch
madsiberian Mar 15, 2026
8a9f3a1
fix: Suppress modal dialogs during MCP dispatch and fix async task hang
madsiberian Mar 17, 2026
ef98b4d
fix: Add null check for model in ModelComponent.CheckSkeleton
madsiberian Mar 17, 2026
4737bcb
refactor: Auto-reimport modified source assets on save and build
madsiberian Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -160,3 +160,6 @@ fastlane/report.xml
fastlane/screenshots
*.user
project.lock.json

# LLM
.claude/
12 changes: 12 additions & 0 deletions .mcp.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"mcpServers": {
"stride-game-runtime": {
"type": "sse",
"url": "http://localhost:5272/sse"
},
"stride-game-studio": {
"type": "sse",
"url": "http://localhost:5271/sse"
}
}
}
848 changes: 848 additions & 0 deletions MCP_IMPLEMENTATION_PLAN.md

Large diffs are not rendered by default.

945 changes: 944 additions & 1 deletion build/Stride.sln

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions sources/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@
<PackageVersion Include="Vortice.Vulkan" Version="3.0.3" />
<PackageVersion Include="WinPixEventRuntime" Version="1.0.240308001" />
</ItemGroup>
<!-- MCP dependencies -->
<ItemGroup>
<PackageVersion Include="ModelContextProtocol" Version="0.8.0-preview.1" />
<PackageVersion Include="ModelContextProtocol.AspNetCore" Version="0.8.0-preview.1" />
</ItemGroup>
<!-- Other dependencies -->
<ItemGroup>
<PackageVersion Include="JetBrains.Rider.PathLocator" Version="1.0.12" />
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.

using System;
using System.IO;
using System.Threading.Tasks;
using Stride.Assets.Presentation.AssetEditors.EntityHierarchyEditor.Services;
using Stride.Assets.Presentation.AssetEditors.GameEditor.Game;
using Stride.Assets.Presentation.AssetEditors.GameEditor.ViewModels;
using Stride.Editor.EditorGame.Game;
using Stride.Graphics;

namespace Stride.Assets.Presentation.AssetEditors.EntityHierarchyEditor.Game
{
public class EditorGameScreenshotService : EditorGameServiceBase, IEditorGameScreenshotService
{
private readonly GameEditorViewModel editor;

private EntityHierarchyEditorGame game;

public EditorGameScreenshotService(GameEditorViewModel editor)
{
this.editor = editor;
}

protected override Task<bool> Initialize(EditorServiceGame editorGame)
{
if (editorGame == null) throw new ArgumentNullException(nameof(editorGame));
game = (EntityHierarchyEditorGame)editorGame;

return Task.FromResult(true);
}

/// <inheritdoc/>
public async Task<byte[]> CaptureViewportAsync()
{
return await editor.Controller.InvokeAsync(() =>
{
var presenter = game.GraphicsDevice.Presenter;
if (presenter?.BackBuffer == null)
throw new InvalidOperationException("Graphics presenter or back buffer is not available.");

using var stream = new MemoryStream();
presenter.BackBuffer.Save(game.GraphicsContext.CommandList, stream, ImageFileType.Png);
return stream.ToArray();
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ protected override void InitializeServices(EditorGameServiceRegistry services)
services.Add(new PhysicsDebugShapeService());
services.Add(new EditorGameLightProbeGizmoService(Editor));
services.Add(new EditorGameCubemapService(Editor));
services.Add(new EditorGameScreenshotService(Editor));
services.Add(new EditorGameSpaceMarkerService());
services.Add(new EditorGameCameraOrientationService());
services.Add(new EditorGameComponentGizmoService(this));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.

using System.Threading.Tasks;
using Stride.Editor.EditorGame.ViewModels;

namespace Stride.Assets.Presentation.AssetEditors.EntityHierarchyEditor.Services
{
/// <summary>
/// Viewport screenshot capture service.
/// </summary>
public interface IEditorGameScreenshotService : IEditorGameViewModelService
{
/// <summary>
/// Captures the current viewport as a PNG image.
/// </summary>
/// <returns>The PNG image data as a byte array.</returns>
Task<byte[]> CaptureViewportAsync();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Stride.Core.Presentation.Commands;
using Stride.Core.Presentation.Interop;
using Stride.Assets.Presentation.AssetEditors.GameEditor.Services;
using Stride.Editor.EditorGame.ViewModels;

namespace Stride.Assets.Presentation.AssetEditors.GameEditor.ViewModels
{
Expand Down Expand Up @@ -53,6 +54,14 @@ protected GameEditorViewModel([NotNull] AssetViewModel asset, [NotNull] Func<Gam
[NotNull]
protected internal virtual IEditorGameController Controller { get; }

/// <summary>
/// Gets an editor game service by its interface type.
/// </summary>
/// <typeparam name="T">The service interface type.</typeparam>
/// <returns>The service instance.</returns>
public T GetEditorGameService<T>() where T : IEditorGameViewModelService
=> Controller.GetService<T>();

[NotNull]
public ICommandBase CopyErrorToClipboardCommand { get; }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using Stride.Core.Mathematics;
using Stride.Core.Quantum;
using Stride.Assets.Presentation.AssetEditors.AssetCompositeGameEditor.Services;
using Stride.Assets.Presentation.AssetEditors.EntityHierarchyEditor.Game;
using Stride.Assets.Presentation.AssetEditors.PrefabEditor.Game;
using Stride.Assets.Presentation.AssetEditors.UIEditor.Game;
using Stride.Assets.Presentation.AssetEditors.UIEditor.ViewModels;
Expand Down Expand Up @@ -364,6 +365,7 @@ protected override void InitializeServices(EditorGameServiceRegistry services)

services.Add(new UIEditorGameCameraService(this));
services.Add(AdornerService = new UIEditorGameAdornerService(this));
services.Add(new EditorGameScreenshotService(Editor));
}

/// <inheritdoc/>
Expand Down
Loading