foundryvtt-mcp 1.2.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/foundry/client.d.ts +87 -1
- package/dist/foundry/client.d.ts.map +1 -1
- package/dist/foundry/client.js +171 -0
- package/dist/foundry/client.js.map +1 -1
- package/dist/foundry/types.d.ts +15 -0
- package/dist/foundry/types.d.ts.map +1 -1
- package/dist/tools/definitions.d.ts +111 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +95 -2
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/handlers/combat-mutations.d.ts +28 -5
- package/dist/tools/handlers/combat-mutations.d.ts.map +1 -1
- package/dist/tools/handlers/combat-mutations.js +81 -11
- package/dist/tools/handlers/combat-mutations.js.map +1 -1
- package/dist/tools/handlers/token-mutations.d.ts +50 -0
- package/dist/tools/handlers/token-mutations.d.ts.map +1 -0
- package/dist/tools/handlers/token-mutations.js +119 -0
- package/dist/tools/handlers/token-mutations.js.map +1 -0
- package/dist/tools/router.d.ts.map +1 -1
- package/dist/tools/router.js +28 -3
- package/dist/tools/router.js.map +1 -1
- package/package.json +15 -11
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Token manipulation mutation tool handlers (FR-019)
|
|
3
|
+
*
|
|
4
|
+
* Provides GM-gated token-control tools that operate on tokens placed on
|
|
5
|
+
* scenes: moving a token to new coordinates, and applying/removing a status
|
|
6
|
+
* condition (ActiveEffect) on the token's actor. All are WRITE operations —
|
|
7
|
+
* they require FOUNDRY_WRITE_ENABLED=true and an active Socket.IO connection
|
|
8
|
+
* (mutations use the core `modifyDocument` protocol), and the connected user
|
|
9
|
+
* needs GM/owner permission.
|
|
10
|
+
*/
|
|
11
|
+
import { ErrorCode, McpError } from '@modelcontextprotocol/sdk/types.js';
|
|
12
|
+
import { withToolError } from './utils.js';
|
|
13
|
+
/**
|
|
14
|
+
* Moves a token to x/y coordinates on its scene (FR-019).
|
|
15
|
+
*
|
|
16
|
+
* The token is resolved from the cached worldData; `sceneId` is optional and
|
|
17
|
+
* only scopes the lookup (the parent scene is derived from the located token).
|
|
18
|
+
*/
|
|
19
|
+
export async function handleMoveToken(args, foundryClient) {
|
|
20
|
+
const { tokenId, x, y, sceneId } = args;
|
|
21
|
+
if (!tokenId || typeof tokenId !== 'string') {
|
|
22
|
+
throw new McpError(ErrorCode.InvalidParams, 'tokenId is required and must be a string');
|
|
23
|
+
}
|
|
24
|
+
if (typeof x !== 'number' ||
|
|
25
|
+
!Number.isFinite(x) ||
|
|
26
|
+
typeof y !== 'number' ||
|
|
27
|
+
!Number.isFinite(y)) {
|
|
28
|
+
throw new McpError(ErrorCode.InvalidParams, 'x and y are required and must be finite numbers');
|
|
29
|
+
}
|
|
30
|
+
const located = foundryClient.findToken(tokenId, sceneId);
|
|
31
|
+
if (!located) {
|
|
32
|
+
throw new McpError(ErrorCode.InvalidRequest, `Token not found: ${tokenId}${sceneId ? ` on scene ${sceneId}` : ''}`);
|
|
33
|
+
}
|
|
34
|
+
return withToolError('move token', async () => {
|
|
35
|
+
const tokenName = located.token.name ?? tokenId;
|
|
36
|
+
await foundryClient.moveToken(located.scene._id, tokenId, x, y);
|
|
37
|
+
return {
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `🚶 **Token Moved**
|
|
42
|
+
**Token:** ${tokenName} (${tokenId})
|
|
43
|
+
**Scene:** ${located.scene.name} (${located.scene._id})
|
|
44
|
+
**Position:** (${x}, ${y})`,
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Applies or removes a status condition (ActiveEffect) on a token's actor
|
|
52
|
+
* (FR-019).
|
|
53
|
+
*
|
|
54
|
+
* `active` defaults to `true` (apply). Mirrors `Actor#toggleStatusEffect`:
|
|
55
|
+
* the effect is matched by its `statuses` array, so re-applying an already
|
|
56
|
+
* present condition (or removing an absent one) is a no-op. Linked actors
|
|
57
|
+
* resolve to `Actor.<id>`; unlinked tokens target their synthetic actor at
|
|
58
|
+
* `Scene.<sid>.Token.<tid>.Actor.<aid>`.
|
|
59
|
+
*/
|
|
60
|
+
export async function handleApplyStatusEffect(args, foundryClient) {
|
|
61
|
+
const { tokenId, statusId, sceneId } = args;
|
|
62
|
+
const active = args.active ?? true;
|
|
63
|
+
if (!tokenId || typeof tokenId !== 'string') {
|
|
64
|
+
throw new McpError(ErrorCode.InvalidParams, 'tokenId is required and must be a string');
|
|
65
|
+
}
|
|
66
|
+
if (!statusId || typeof statusId !== 'string') {
|
|
67
|
+
throw new McpError(ErrorCode.InvalidParams, 'statusId is required and must be a string');
|
|
68
|
+
}
|
|
69
|
+
const located = foundryClient.findToken(tokenId, sceneId);
|
|
70
|
+
if (!located) {
|
|
71
|
+
throw new McpError(ErrorCode.InvalidRequest, `Token not found: ${tokenId}${sceneId ? ` on scene ${sceneId}` : ''}`);
|
|
72
|
+
}
|
|
73
|
+
const token = located.token;
|
|
74
|
+
const actorId = token.actorId;
|
|
75
|
+
if (!actorId) {
|
|
76
|
+
throw new McpError(ErrorCode.InvalidRequest, `Token ${tokenId} has no associated actor; cannot apply status effects.`);
|
|
77
|
+
}
|
|
78
|
+
// Linked tokens share the world actor; unlinked tokens own a synthetic actor
|
|
79
|
+
// (the per-token delta) that must be addressed through the Scene→Token path.
|
|
80
|
+
const linked = token.actorLink === true;
|
|
81
|
+
const parentActorUuid = linked
|
|
82
|
+
? `Actor.${actorId}`
|
|
83
|
+
: `Scene.${located.scene._id}.Token.${tokenId}.Actor.${actorId}`;
|
|
84
|
+
// Find an existing effect carrying this status (matches toggleStatusEffect).
|
|
85
|
+
const effects = linked
|
|
86
|
+
? (foundryClient.getRawActor(actorId)?.effects ?? [])
|
|
87
|
+
: (token.delta?.effects ?? []);
|
|
88
|
+
const existing = effects.find((e) => e.statuses?.includes(statusId));
|
|
89
|
+
return withToolError('apply status effect', async () => {
|
|
90
|
+
if (active) {
|
|
91
|
+
if (existing) {
|
|
92
|
+
return statusResult(`Status effect '${statusId}' is already active on ${token.name ?? tokenId}.`, tokenId, located.scene, statusId, true);
|
|
93
|
+
}
|
|
94
|
+
const effect = await foundryClient.createActorStatusEffect(parentActorUuid, statusId);
|
|
95
|
+
return statusResult(`Applied status effect '${statusId}' (effect ${effect._id}).`, tokenId, located.scene, statusId, true);
|
|
96
|
+
}
|
|
97
|
+
if (!existing) {
|
|
98
|
+
return statusResult(`Status effect '${statusId}' is not active on ${token.name ?? tokenId}; nothing to remove.`, tokenId, located.scene, statusId, false);
|
|
99
|
+
}
|
|
100
|
+
await foundryClient.deleteActorEffect(parentActorUuid, existing._id);
|
|
101
|
+
return statusResult(`Removed status effect '${statusId}' (effect ${existing._id}).`, tokenId, located.scene, statusId, false);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/** Builds the MCP text result for a status-effect mutation. */
|
|
105
|
+
function statusResult(summary, tokenId, scene, statusId, active) {
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: `${active ? '✨' : '🧹'} **Status Effect ${active ? 'Applied' : 'Removed'}**
|
|
111
|
+
**Token:** ${tokenId}
|
|
112
|
+
**Scene:** ${scene.name} (${scene._id})
|
|
113
|
+
**Status:** ${statusId}
|
|
114
|
+
${summary}`,
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=token-mutations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-mutations.js","sourceRoot":"","sources":["../../../src/tools/handlers/token-mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,WAAW,CAAC;AAwCzD;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB,EACpC,gBAAgB,EAAE,gBAAgB,GACjC,OAAO,CAAC,UAAU,CAAC,CA+OrB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,aAAa,EAC5B,iBAAiB,EAAE,iBAAiB;;;;;;GAIrC"}
|
package/dist/tools/router.js
CHANGED
|
@@ -7,7 +7,7 @@ import { handleUpdateActorAttribute } from './handlers/actor-mutations.js';
|
|
|
7
7
|
import { handleGetActorDetails, handleSearchActors } from './handlers/actors.js';
|
|
8
8
|
import { handleGetChatMessages } from './handlers/chat.js';
|
|
9
9
|
import { handleGetCombatState } from './handlers/combat.js';
|
|
10
|
-
import { handleEndCombat, handleNextTurn, handleSetInitiative, } from './handlers/combat-mutations.js';
|
|
10
|
+
import { handleEndCombat, handleNextTurn, handleSetInitiative, handleStartCombat, } from './handlers/combat-mutations.js';
|
|
11
11
|
import { handleSearchCompendium } from './handlers/compendium.js';
|
|
12
12
|
import { handleDiagnoseErrors, handleGetHealthStatus, handleGetRecentLogs, handleGetSystemHealth, handleSearchLogs, } from './handlers/diagnostics.js';
|
|
13
13
|
// Import all tool handlers
|
|
@@ -18,6 +18,7 @@ import { handleSearchItems } from './handlers/items.js';
|
|
|
18
18
|
import { handleGetJournal, handleSearchJournals } from './handlers/journals.js';
|
|
19
19
|
import { handleReadResource } from './handlers/resources.js';
|
|
20
20
|
import { handleGetSceneInfo } from './handlers/scenes.js';
|
|
21
|
+
import { handleApplyStatusEffect, handleMoveToken } from './handlers/token-mutations.js';
|
|
21
22
|
import { handleGetUsers } from './handlers/users.js';
|
|
22
23
|
import { handleGetWorldSummary, handleRefreshWorldData, handleSearchWorld, } from './handlers/world.js';
|
|
23
24
|
import { toolRegistry } from './registry.js';
|
|
@@ -58,7 +59,8 @@ export async function routeToolRequest(name, args, foundryClient, diagnosticsCli
|
|
|
58
59
|
throw new Error('Missing required parameter: actorId');
|
|
59
60
|
}
|
|
60
61
|
return handleGetActorDetails(args, foundryClient);
|
|
61
|
-
// Actor mutation tools (#143
|
|
62
|
+
// Actor mutation tools (#143) — WRITE via the Socket.IO modifyDocument
|
|
63
|
+
// protocol (foundryClient); require FOUNDRY_WRITE_ENABLED=true + a GM user.
|
|
62
64
|
case 'update_actor_attributes':
|
|
63
65
|
if (!('actorId' in args) || typeof args.actorId !== 'string') {
|
|
64
66
|
throw new Error('Missing required parameter: actorId');
|
|
@@ -76,7 +78,8 @@ export async function routeToolRequest(name, args, foundryClient, diagnosticsCli
|
|
|
76
78
|
throw new Error('Missing required parameter: query');
|
|
77
79
|
}
|
|
78
80
|
return handleSearchCompendium(args, foundryClient);
|
|
79
|
-
// Item mutation tools (WRITE —
|
|
81
|
+
// Item mutation tools (WRITE) — Socket.IO modifyDocument protocol
|
|
82
|
+
// (foundryClient); require FOUNDRY_WRITE_ENABLED=true + a GM user.
|
|
80
83
|
case 'create_actor_item':
|
|
81
84
|
if (!('actorId' in args) || typeof args.actorId !== 'string') {
|
|
82
85
|
throw new Error('Missing required parameter: actorId');
|
|
@@ -123,6 +126,28 @@ export async function routeToolRequest(name, args, foundryClient, diagnosticsCli
|
|
|
123
126
|
throw new Error('Missing required parameter: initiative');
|
|
124
127
|
}
|
|
125
128
|
return handleSetInitiative(args, foundryClient);
|
|
129
|
+
case 'start_combat':
|
|
130
|
+
return handleStartCombat(args, foundryClient);
|
|
131
|
+
// Token mutation tools (FR-019, WRITE — require FOUNDRY_WRITE_ENABLED)
|
|
132
|
+
case 'move_token':
|
|
133
|
+
if (!('tokenId' in args) || typeof args.tokenId !== 'string') {
|
|
134
|
+
throw new Error('Missing required parameter: tokenId');
|
|
135
|
+
}
|
|
136
|
+
if (!('x' in args) || typeof args.x !== 'number') {
|
|
137
|
+
throw new Error('Missing required parameter: x');
|
|
138
|
+
}
|
|
139
|
+
if (!('y' in args) || typeof args.y !== 'number') {
|
|
140
|
+
throw new Error('Missing required parameter: y');
|
|
141
|
+
}
|
|
142
|
+
return handleMoveToken(args, foundryClient);
|
|
143
|
+
case 'apply_status_effect':
|
|
144
|
+
if (!('tokenId' in args) || typeof args.tokenId !== 'string') {
|
|
145
|
+
throw new Error('Missing required parameter: tokenId');
|
|
146
|
+
}
|
|
147
|
+
if (!('statusId' in args) || typeof args.statusId !== 'string') {
|
|
148
|
+
throw new Error('Missing required parameter: statusId');
|
|
149
|
+
}
|
|
150
|
+
return handleApplyStatusEffect(args, foundryClient);
|
|
126
151
|
// Chat tools
|
|
127
152
|
case 'get_chat_messages':
|
|
128
153
|
return handleGetChatMessages(args, foundryClient);
|
package/dist/tools/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAKzE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/tools/router.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "foundryvtt-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Model Context Protocol server for FoundryVTT integration",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -72,39 +72,43 @@
|
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
74
74
|
"ajv": "^8.20.0",
|
|
75
|
-
"axios": "^1.
|
|
75
|
+
"axios": "^1.18.0",
|
|
76
76
|
"dotenv": "^17.4.2",
|
|
77
77
|
"socket.io-client": "^4.8.3",
|
|
78
78
|
"zod": "^4.4.3"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@biomejs/biome": "^2.
|
|
82
|
-
"@playwright/test": "^1.
|
|
83
|
-
"@types/node": "^25.
|
|
81
|
+
"@biomejs/biome": "^2.5.0",
|
|
82
|
+
"@playwright/test": "^1.61.0",
|
|
83
|
+
"@types/node": "^25.9.4",
|
|
84
84
|
"husky": "^9.1.7",
|
|
85
|
-
"lint-staged": "^17.0.
|
|
85
|
+
"lint-staged": "^17.0.7",
|
|
86
86
|
"rimraf": "^6.1.3",
|
|
87
|
-
"tsx": "^4.
|
|
87
|
+
"tsx": "^4.22.4",
|
|
88
88
|
"typedoc": "^0.28.19",
|
|
89
89
|
"typescript": "^6.0.3",
|
|
90
|
-
"vitest": "^4.1.
|
|
90
|
+
"vitest": "^4.1.9"
|
|
91
91
|
},
|
|
92
92
|
"engines": {
|
|
93
93
|
"node": ">=18.0.0"
|
|
94
94
|
},
|
|
95
95
|
"overrides": {
|
|
96
96
|
"@hono/node-server": "^1.19.14",
|
|
97
|
-
"hono": "^4.12.
|
|
97
|
+
"hono": "^4.12.26",
|
|
98
98
|
"express-rate-limit": "^8.5.1",
|
|
99
99
|
"ip-address": "^10.2.0",
|
|
100
100
|
"path-to-regexp": "^8.4.2",
|
|
101
101
|
"fast-uri": "^3.1.2",
|
|
102
102
|
"socket.io-parser": "^4.2.6",
|
|
103
|
-
"vite": "^7.3.
|
|
103
|
+
"vite": "^7.3.5",
|
|
104
104
|
"rollup": "^4.60.3",
|
|
105
105
|
"postcss": "^8.5.14",
|
|
106
106
|
"picomatch": "^4.0.4",
|
|
107
|
-
"brace-expansion": "^5.0.6"
|
|
107
|
+
"brace-expansion": "^5.0.6",
|
|
108
|
+
"form-data": "^4.0.6",
|
|
109
|
+
"ws": "^8.21.0",
|
|
110
|
+
"markdown-it": "^14.2.0",
|
|
111
|
+
"qs": "^6.15.2"
|
|
108
112
|
},
|
|
109
113
|
"lint-staged": {
|
|
110
114
|
"src/**/*.{ts,tsx,js,jsx}": [
|