示例:Arcade服务器
MCP Apps服务器,让您浏览和玩经典街机游戏 archive.org 直接在启用MCP的主机中。
法律免责声明
这是一个技术演示,而不是一个分发平台。
- 游戏在运行时直接从archive.org的嵌入系统中获取
- 我们不托管、分发或存储游戏内容
- 只能加载具有验证分发权限的游戏
- 未经验证权限的游戏被阻止
权限验证的工作原理
服务器使用 严格的核查制度:
- 管理许可名单:游戏在
allowlist.ts拥有外部记录的源网址(出版商公告、官方网站)的分发权。每个条目都包含法律依据。
- 元数据验证:对于不在允许列表中的游戏,我们检查archive.org元数据中的明确权利指标(共享软件、免费软件、公共领域、知识共享)。
只有经过验证的权限才允许游戏。 未知或受限游戏被阻止。
有哪些游戏可供选择?
- 共享软件:明确免费发布的第一集/演示(DOOM、Duke Nukem、指挥官Keen、Wolfenstein 3D等)
- 免费软件:由发行商正式免费发行的游戏(《Tyrian 2000》、《Jill of the Jungle》)
- 公共领域:版权已过期或被放弃的游戏
看 allowlist.ts 查看完整的清单和法律文件。
模拟器运行时
Archive.org使用 乳化性 系统在浏览器中运行游戏。这包括:
| 仿真器 | 许可证 | 用于 |
|---|---|---|
| DOSBox | GPL-2.0+ | DOS游戏 |
| EM-DOSBox | GPL-2.0+ | DOSBox通过Emscripten编译为JavaScript |
| 多机种街机模拟器 | BSD-3条款/GPL-2.0+ | 街机游戏 |
我们与这些模拟器的关系:
- 我们做 不 分发、捆绑或修改任何仿真器代码
- 仿真器在运行时直接从archive.org获取
- 我们只使用proxy-archive.org的嵌入系统,该系统托管这些模拟器的自己的副本
- 临时内存缓存(见下文)纯粹是为了CORS解决方法
许可证兼容性说明:
MCP Apps SDK是Apache-2.0许可的。没有许可证冲突,因为:
- 街机服务器 不 捆绑、包含或链接GPL模拟器代码
- 模拟器在运行时从archive.org获取(就像加载任何CDN资源一样)
- 模拟器在用户的浏览器中执行,这是一个单独的执行上下文
- 这类似于嵌入YouTube视频——嵌入页面不是YouTube播放器的衍生产品
如果你创建了一个修改后的版本 捆绑包 在将仿真器代码引入发行版时,您必须遵守GPL-2.0+条款(copyleft,源代码可用性)。
脚本重新托管(CORS解决方案)
服务器临时缓存archive.org的 emulation.min.js 仅在内存中执行脚本(不持久化到磁盘),以绕过沙盒iframe中的浏览器安全限制。这是技术上的需要,而不是再分配:
- 缓存使用
Cache-Control: no-store标头 - 服务器重新启动时清除缓存
- 脚本在第一次请求时从archive.org获取
- 除更换外,不进行任何修改
import()随着loadScript()为了iframe兼容性
添加新游戏
要将游戏添加到列表中,您必须提供:
- 源URL:指向记录发行权的权威来源的链接(出版商网站、新闻稿、官方公告)
- 法律依据:明确解释为什么游戏可以合法发行
- 验证:确认archive.org标识符有效
如有疑问,请勿添加游戏。
概述
此示例演示了服务 外部HTML内容 作为MCP应用程序资源。该资源是一个静态加载器,它使用MCP Apps协议接收工具参数,然后从服务器端点获取处理后的游戏HTML。这种模式允许同一资源根据工具输入显示不同的游戏。
关键技术:
- MCP Apps协议握手(
ui/initialize→ui/notifications/tool-input)动态接收游戏ID - 每个游戏ID的服务器端HTML获取和处理
- `` 用于解析相对于archive.org的相对URL的标签
baseUriDomainsCSP元数据允许基本标记- 重写ES模块
import()经典 `` 加载(用于srcdoc-iframe兼容性) - 绕过沙盒iframe中CORS限制的本地脚本端点
- 权限检查 在加载游戏之前验证分发权限
关键文件
server.ts-带工具和资源注册的MCP服务器index.ts-HTTP传输和Express设置game-processor.ts-获取和处理archive.org HTMLsearch.ts-Archive.org搜索,具有智能回退和权限过滤功能rights-checker.ts-分析archive.org元数据以获取分发权限allowlist.ts-经过验证的共享软件/免费软件游戏精选列表types.ts-权限管理的类型定义
入门指南
npm install
npm run dev服务器启动于 http://localhost:3002/mcp 默认情况下。设置 PORT 环境变量来改变它。
MCP客户端配置
{
"mcpServers": {
"arcade": {
"url": "http://localhost:3002/mcp"
}
}
}工具
| 工具 | 说明 | UI |
|---|---|---|
search_games | 搜索经过验证的共享软件/免费游戏 | 否 |
get_game_by_id | 加载并玩经过验证的版权游戏 | 是 |
search_games参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
searchTerm | string | - | 游戏名称或搜索词 |
maxResults | number | 10 | 最大结果(1-50) |
get_game_by_id参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
gameId | string | - | 游戏的Archive.org标识符 |
运作原理
1. Host calls search_games → Server searches allowlist + archive.org → Returns verified games only
2. Host calls get_game_by_id → Server verifies rights status
3. If rights verified → Tool returns success
4. If rights NOT verified → Tool returns error, game blocked
5. Host reads resource → Gets static loader with MCP Apps protocol handler
6. View performs ui/initialize handshake with host
7. Host sends tool-input with gameId → View fetches /game-html/:gameId
8. Server fetches embed HTML from archive.org and processes it:
- Removes archive.org's tag
- Injects for URL resolution
- Rewrites ES module import() to loading
- Fetches emulation.min.js, patches it, serves from local endpoint
- Injects layout CSS for full-viewport display
9. Game runs: emulator loads ROM, initializes MAME, game is playable为什么要处理?
Archive.org的游戏嵌入页面使用ES模块 import() 用于加载仿真引擎。在 srcdoc iframe(由MCP主机使用), import() 失败,因为iframe具有 null 起源。服务器通过以下方式解决此问题:
- 获取
emulation.min.js服务器端 并替换import()随着window.loadScript() - 提供已修补的脚本 从本地Express端点(
/scripts/emulation.js) - 使用 `` 它不受CORS限制,不像
fetch()或import()
可用游戏(18个已验证的游戏)
所有游戏都有经过验证的发行权。看 allowlist.ts 法律文件。
id软件共享软件
| 标识符 | 标题 | 年份 |
|---|---|---|
doom-play | 厄运 | 1993 |
msdos_DOOM_1993 | 厄运(MS-DOS) | 1993 |
wolfenstein-3d | 《德军总部3D》 | 1992 |
w3d-box | 《德军总部3D》v1.4 | 1993 |
commander_keen_volume_one_131 | 《基恩指挥官:火星上的马龙》1990 | |
heretic-dos | 异端 | 1994 |
Apogee/3D Realms共享软件
| 标识符 | 标题 | 年份 |
|---|---|---|
duke-nukem2-sw | 杜克核武器II | 1993 |
3dduke13SW-altcontrols | 《Duke Nukem 3D》 | 1996年 |
Bs-aog-sw1 | 布莱克·斯通:《黄金异形》1993 | |
rise-of-the-triad-the-hunt-begins-version-1.0 | 三合会的崛起 | 1994 |
biomenace1-sw | 生物威胁 | 1993 |
Crystal-cave-sw1 | 水晶洞穴 | 1991 |
monster-bash1-sw | 怪物狂欢 | 1993 |
halloween_harry_shareware | 万圣节哈利 | 1993 |
Epic MegaGames共享软件/免费软件
| 标识符 | 标题 | 年份 |
|---|---|---|
Epic-pinball-sw1 | 史诗弹珠台 | 1993 |
radsw20 | 根:虚空之外 | 1995 |
msdos_Tyrian_2000_1999 | Tyrian 2000(免费软件) | 1999 |
jill-of-the-jungle-0mhz | 丛林中的吉尔(免费软件) | 1992 |
