这是一个与 FoundryVTT 集成的模型上下文协议(MCP)服务器,允许 AI 助手与你的桌面游戏会话进行交互。你可以通过自然语言查询角色、掷骰子、生成内容并管理游戏世界。
本服务器可让你借助 AI 助手,通过自然语言与桌面游戏会话交互,实现查询角色、掷骰子、生成内容和管理游戏世界等操作。
🧙♂️ 交互式设置向导:
git clone
cd foundry-mcp-server
npm install
npm run setup-wizard
设置向导将:
.env 配置文件git clone
cd foundry-mcp-server
npm install
cp .env.example .env
# 用你的 FoundryVTT 详细信息编辑 .env
FOUNDRY_URL=http://localhost:30000
FOUNDRY_API_KEY=your_api_key_here
# 或者使用用户名/密码:
FOUNDRY_USERNAME=your_username
FOUNDRY_PASSWORD=your_password
npm run test-connection # 验证设置
npm run build
npm start
npm run dev
向你的 AI 助手提出如下问题:
掷骰子:
游戏数据:
内容生成:
规则查询:
战术建议:
世界构建:
search_actors - 查找角色、NPC、怪物search_items - 查找装备、法术、消耗品search_journals - 搜索笔记和讲义get_scene_info - 获取当前场景详细信息get_actor_details - 获取角色详细信息roll_dice - 使用任何公式进行掷骰update_actor_hp - 修改角色生命值get_combat_status - 获取战斗状态和先攻顺序lookup_rule - 查询游戏规则和法术描述generate_npc - 创建随机 NPCgenerate_loot - 生成适合等级的战利品roll_table - 随机遭遇、事件、天气suggest_tactics - 提供战斗建议和策略get_system_health - 获取服务器性能和健康指标get_recent_logs - 获取过滤后的 FoundryVTT 日志search_logs - 使用正则表达式模式搜索日志diagnose_errors - 分析错误并提供故障排除建议服务器公开了以下 FoundryVTT 资源:
foundry://world/info - 世界和战役信息foundry://world/actors - 世界中的所有角色foundry://scene/current - 当前活动场景foundry://combat/current - 活动战斗状态foundry://compendium/spells - 法术数据库foundry://compendium/monsters - 怪物数据库编辑 .env 文件进行自定义配置:
# 日志记录
LOG_LEVEL=info # debug, info, warn, error
# 性能
FOUNDRY_TIMEOUT=10000 # 请求超时时间(毫秒)
FOUNDRY_RETRY_ATTEMPTS=3 # 重试失败的请求
CACHE_TTL_SECONDS=300 # 缓存数据 5 分钟
服务器包含全面的诊断工具,可帮助排查连接和性能问题: 连接测试:
# 测试完整的 MCP 连接和功能
npm run test-connection
# 清理构建并测试设置
npm run setup
诊断工具(通过 AI 助手):
使用 本地 REST API 模块 时,你可以访问高级诊断功能:
# 测试 FoundryVTT 连接
curl http://localhost:30000/api/status
# 检查服务器日志
npm run dev # 显示详细日志
"无法连接到 FoundryVTT"
FOUNDRY_URL 是否正确"身份验证失败"
"未找到工具" 错误
src/
├── config/ # 配置管理
├── foundry/ # FoundryVTT 客户端和类型
├── tools/ # MCP 工具定义
├── resources/ # MCP 资源定义
├── utils/ # 实用工具和日志记录
└── index.ts # 主服务器入口点
src/tools/index.ts 中定义工具模式src/index.ts 中添加处理方法src/foundry/client.ts 中实现 FoundryVTT API 调用src/foundry/types.ts 中添加 TypeScript 类型# 运行测试
npm test
# 运行带覆盖率的测试
npm run test:coverage
# 代码检查
npm run lint
# 开发构建
npm run build
# 清理构建
npm run clean && npm run build
| 变量 | 是否必需 | 描述 | 默认值 |
|---|---|---|---|
FOUNDRY_URL |
✅ | FoundryVTT 服务器 URL | - |
FOUNDRY_API_KEY |
⭐ | 用于身份验证的 API 密钥 | - |
FOUNDRY_USERNAME |
⭐ | 用户名(如果没有 API 密钥) | - |
FOUNDRY_PASSWORD |
⭐ | 密码(如果没有 API 密钥) | - |
LOG_LEVEL |
❌ | 日志详细程度 | info |
NODE_ENV |
❌ | 环境模式 | development |
FOUNDRY_TIMEOUT |
❌ | 请求超时时间(毫秒) | 10000 |
FOUNDRY_RETRY_ATTEMPTS |
❌ | 重试失败的请求 | 3 |
CACHE_TTL_SECONDS |
❌ | 缓存持续时间 | 300 |
⭐ 需要 API 密钥或用户名/密码
{
"formula": "1d20+5",
"reason": "Attack roll against goblin"
}
{
"query": "goblin",
"type": "npc",
"limit": 10
}
{
"race": "human",
"level": 5,
"role": "merchant",
"alignment": "neutral good"
}
添加到你的 Claude Desktop MCP 设置中:
{
"mcpServers": {
"foundry": {
"command": "node",
"args": ["/path/to/foundry-mcp-server/dist/index.js"],
"env": {
"FOUNDRY_URL": "http://localhost:30000",
"FOUNDRY_API_KEY": "your_api_key_here"
}
}
}
}
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
const transport = new StdioClientTransport({
command: "node",
args: ["./dist/index.js"],
});
const client = new Client(
{
name: "foundry-client",
version: "1.0.0",
},
{
capabilities: {},
},
);
await client.connect(transport);
// 掷骰子
const result = await client.request({
method: "tools/call",
params: {
name: "roll_dice",
arguments: {
formula: "1d20+5",
reason: "Initiative roll",
},
},
});
完整的 API 文档位于 docs/ 目录中,由 TypeScript 源代码和 JSDoc 注释自动生成。
本地开发:
npm run docs # 生成文档
npm run docs:serve # 生成并在本地提供服务
在线: 浏览本仓库中的 docs/ 文件夹或访问 GitHub Pages 站点(如果已启用)。
文档会在源代码更改时通过 GitHub Actions 自动更新。
git checkout -b feature/amazing-featuregit commit -m 'Add amazing feature'git push origin feature/amazing-feature本项目采用 MIT 许可证,详情请参阅 LICENSE 文件。
npm run test-connection # 测试 FoundryVTT 连接性
npm run setup-wizard # 重新运行交互式设置
使用 get_health_status MCP 工具进行全面诊断,或在启动时检查服务器日志以获取详细状态信息。
.env 中的 API 密钥或用户名/密码📖 详细故障排除指南:TROUBLESHOOTING.md
祝游戏愉快!🎲