DalamudMCP

mcp
Security Audit
Warn
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Pass
  • Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Windows-local MCP server and Dalamud plugin for observing FFXIV state and executing opt-in actions.

README.md

DalamudMCP

DalamudMCP exposes live FFXIV state from a Dalamud plugin to both a local CLI and MCP clients.

The current codebase is built around:

  • one handwritten operation file per tool
  • the same operation definition drives both CLI and MCP
  • the plugin owns live game execution
  • the CLI and MCP layers talk to the plugin over a local named pipe

What You Get

  • direct CLI commands such as player context and inventory summary
  • MCP over stdio with serve mcp
  • MCP over bearer-authenticated local HTTP with serve http
  • plugin auto-discovery so normal CLI usage does not need a manual pipe name
  • a plugin settings window that shows runtime health and can start the bundled HTTP server
  • generic game action execution, Lumina Excel exploration, and plugin lifecycle/package management

Safety Defaults

DalamudMCP is observation-first, but it can expose broad mutation capabilities when the user enables them.

  • observation tools are enabled by default
  • action tools are default-off until you enable them in the plugin UI
  • unsafe integration tools are default-off and hidden behind a separate developer toggle
  • an explicit capability policy overrides the legacy toggles and is enforced again for every invocation
  • confirm-once policies show the exact arguments in the plugin UI and consume approval after one matching retry
  • policies can constrain plugin names, action IDs, jobs, territories, sheets, callgates, targets, result counts, and calls per minute
  • denied capabilities are omitted from tools/list

This is intentional. The public surface should stay conservative unless you explicitly widen it.

Current Tool Surface

The table below is generated from the operation attributes in src/DalamudMCP.Plugin/Operations.
Run ./build/update-tools.ps1 after adding or renaming a tool; CI checks the generated block with ./build/update-tools.ps1 -Check.

MCP tool Operation ID Source
capture_game_screenshot game.screenshot GameScreenshotOperation.cs
events_configure events.configure GameEventOperations.cs
events_query events.query GameEventOperations.cs
events_wait events.wait GameEventOperations.cs
game_action_execute game.action.execute GameActionExecuteOperation.cs
game_action_resolve game.action.resolve GameActionResolveOperation.cs
game_data_describe_sheet game-data.describe-sheet GameDataOperations.cs
game_data_get_row game-data.get-row GameDataOperations.cs
game_data_list_sheets game-data.list-sheets GameDataOperations.cs
game_data_search game-data.search GameDataOperations.cs
get_addon_list addon.list AddonListOperation.cs
get_addon_strings addon.strings AddonStringsOperation.cs
get_addon_tree addon.tree AddonTreeOperation.cs
get_available_quests quest.available AvailableQuestsOperation.cs
get_chat_log chat.read ChatLogReadOperation.cs
get_condition_context condition.context ObservationOperations.cs
get_current_quest_objective quest.current-objective CurrentQuestObjectiveOperation.cs
get_duty_context duty.context DutyContextOperation.cs
get_fate_context fate.context FateContextOperation.cs
get_inventory_currencies inventory.currencies ObservationOperations.cs
get_inventory_equipment inventory.equipment ObservationOperations.cs
get_inventory_items inventory.items ObservationOperations.cs
get_inventory_summary inventory.summary InventorySummaryOperation.cs
get_nearby_interactables nearby.interactables NearbyInteractablesOperation.cs
get_party_context party.context ObservationOperations.cs
get_player_context player.context PlayerContextOperation.cs
get_quest_status quest.status QuestStatusOperation.cs
get_session_status session.status SessionStatusOperation.cs
get_target_context target.context ObservationOperations.cs
interact_with_target interact.with.target InteractWithTargetOperation.cs
invoke_plugin_ipc plugin.ipc SafeInvokePluginIpcOperation.cs
move_to_entity move.to.entity MoveToEntityOperation.cs
move_to_nearby_interactable move.to.nearby.interactable MoveToNearbyInteractableOperation.cs
plugin_data_poll plugin.data.poll PluginDataPollOperation.cs
plugin_data_subscribe plugin.data.subscribe PluginDataSubscribeOperation.cs
plugin_data_unsubscribe plugin.data.unsubscribe PluginDataUnsubscribeOperation.cs
plugin_describe plugin.inspect.describe PluginManagementOperations.cs
plugin_lifecycle plugin.lifecycle.control PluginManagementOperations.cs
plugin_list plugin.inspect.list PluginManagementOperations.cs
plugin_package plugin.package.control PluginManagementOperations.cs
reload_plugin plugin.reload PluginReloadOperation.cs
select_addon_menu_item addon.select.menu-item AddonSelectMenuItemOperation.cs
send_addon_callback_values addon.callback.values AddonCallbackValuesOperation.cs
send_addon_event addon.event AddonEventOperation.cs
send_addon_input addon.input AddonInputOperation.cs
slash_command command.slash SlashCommandOperation.cs
target_object target.object TargetObjectOperation.cs
teleport_to_aetheryte teleport.to.aetheryte TeleportToAetheryteOperation.cs
unsafe_invoke_plugin_ipc unsafe.invoke.plugin-ipc UnsafeInvokePluginIpcOperation.cs
use_duty_action duty.action DutyActionOperation.cs

The generic Excel search is bounded to 100 returned rows, 10,000 scanned rows, and 500 ms per call. Plugin package operations only select manifests already present in Dalamud's configured repositories; the MCP request cannot supply an arbitrary download URL or CLR method name.

Manifold remains at 1.0.0 because it owns the operation and CLI layer, not MCP version negotiation. The MCP-facing layer uses the official C# SDK 2.1.0 and adds transport-independent effect, permission, schema, and execution metadata to the internal protocol descriptor.

The handwritten truth source for these operations lives under src/DalamudMCP.Plugin/Operations.

Install And Run

1. Build

.\build\restore.ps1
.\build\build.ps1 -NoRestore

If Dalamud is not installed in the default developer path, set DALAMUD_HOME or pass -DalamudHome to the build scripts.

$env:DALAMUD_HOME = 'C:\path\to\Hooks\dev'
.\build\build.ps1 -NoRestore -DalamudHome $env:DALAMUD_HOME

2. Install The Plugin

The active plugin is:

Build output:

Load that plugin in Dalamud, then open its configuration window.

3. Try The CLI

dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- player context
dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- session status --json
dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- inventory summary

Normal CLI use auto-discovers the active plugin instance from active-instance.json.

--pipe <name> is still supported as an advanced override for debugging or multi-instance scenarios.

Self-update and self-uninstall require the external supervisor so the verification process survives the plugin stopping or restarting:

dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- supervise self-package --action update --timeout-seconds 90
dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- supervise self-package --action uninstall --timeout-seconds 90

The plugin.self.manage capability must be explicitly confirmed or allowed before either command can proceed.

4. Run MCP

stdio MCP:

dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- serve mcp

Local HTTP MCP:

$env:DALAMUD_MCP_HTTP_TOKEN = '<token>'
dotnet run --project .\src\DalamudMCP.Cli\DalamudMCP.Cli.csproj -- serve http --port 38473

Default endpoint:

  • http://127.0.0.1:38473/mcp

The plugin UI can also start and stop the bundled HTTP MCP server for you. It generates a 256-bit bearer token, passes it to the child process without putting it on the command line, and provides separate buttons for copying the endpoint and token. HTTP clients must send Authorization: Bearer <token>.

The HTTP server binds only to 127.0.0.1, rejects non-loopback Origin values, and delegates MCP version negotiation to the official C# SDK transport. The named-pipe bridge is current-user-only and rejects frames larger than 16 MiB.

See design/capability-kernel.md for capability policy configuration and the current limits of the implementation.

5. Build A Release Package

Build the plugin in Release and package the plugin output directory manually.

.\.dotnet\dotnet.exe build .\src\DalamudMCP.Plugin\DalamudMCP.Plugin.csproj -c Release

If you need a custom Dalamud path:

$env:DALAMUD_HOME = 'C:\path\to\Hooks\dev'
.\.dotnet\dotnet.exe build .\src\DalamudMCP.Plugin\DalamudMCP.Plugin.csproj -c Release

The packaged output is written under src/DalamudMCP.Plugin/bin/Release/DalamudMCP/. Upload the generated latest.zip manually when cutting a release.

Optional Integrations

When compatible plugins are installed, DalamudMCP can use them behind existing high-level tools.

  • teleport.to.aetheryte can fall back to Lifestream for local aethernet travel
  • movement operations can use vnavmesh when available

These integrations stay behind normal high-level tools by default. Raw integration escape hatches remain developer-only.

Build And Test

GitHub Actions CI validates the portable layers and repository hygiene.
The plugin build remains a local or self-hosted Windows step because Dalamud.NET.Sdk still needs a resolved DALAMUD_HOME / Hooks dev directory.

Build:

.\build\build.ps1 -NoRestore

Full test run:

.\build\test.ps1 -NoBuild

The active solution is DalamudMCP.slnx.

Repository Layout

Active projects:

Test projects:

Reviews (0)

No results found