用途
mcp-imslp 是一个 MCP(模型上下文协议)服务器,把聊天客户端接入 IMSLP(International Music Score Library Project,又称佩特鲁奇音乐图书馆)。IMSLP 是由志愿者运营的免费古典音乐图书馆,收录版权已过期的乐谱、分谱、改编曲和录音,以及各作曲家页面上的资料。它分别针对加拿大、美国和欧盟审查每份乐谱的版权,页面以 CC BY-SA 4.0 发布。
这个服务器读取该图书馆并链接回它,不需要 API 密钥,也不需要账号。
主要能力
你可以用它完成以下操作:
- 搜索作品与人物,并读取其页面。
- 读取一部作品:其标题与别名、作曲家、作品号与目录号、创作年份与首次出版年份、题献、调性、语言、编剧、编制、乐章、首演、风格与时期。
- 逐版浏览一部作品所持有的版本,包括出版商、编者和版权条款。
- 读取某位作曲家(以及编者、改编者、演奏者)在图书馆中的资料:生活年代、别名、权威登记记录等。
- 按体裁、调性或编制浏览作品。
可提出的示例问题包括:
- “IMSLP 有哪些肖邦的夜曲?”
- “读一下 Erik Satie 的页面,告诉我他生活在什么年代。”
- “列出德彪西《月光》的各个版本,以及每个版本的出版者。”
- “那首曲子的 Henle 版在美国可以自由使用吗?”
- “给我看图书馆中为独奏大提琴创作的作品。”
使用方式
一次点击安装
适用于 Claude Desktop、Cursor,以及任何使用标准配置格式的客户端。需要 Node 24 或更高版本,无需设置任何环境变量。
命令行中 -i 保持标准输入打开(这是协议传输的通道),省略 -t 是因为 TTY 会改写数据流。容器需要能对外 HTTPS 访问 imslp.org,无需其他东西:没有卷、没有端口、没有凭据。
不使用 npm 的捆绑包
从最新发布中下载 mcp-imslp-1.0.1.mcpb 并打开。支持 MCP 捆绑包的客户端会自行安装,不需要 npm,也无需编辑配置文件。捆绑包自带依赖,因此安装时不下载任何东西。
常用路径
常规路径是从搜索到作品:search_works 给出作品的页面名,get_work 读取该页面。人物同理,从 search_people 到 get_person 或 list_person_works。
作品通过其页面标题寻址,写作 Work (Composer),例如 Nocturnes, Op.9 (Chopin, Frédéric)。人物通过分类寻址,写作 Category:Surname, Forename。两者都能从搜索中返回,Category: 前缀可以省略。
图书馆以作曲家所使用的语言为作品命名,因此 Die Zauberflöte 会找到歌剧,而 The Magic Flute 会找到关于它的页面。一部著名作品返回结果稀少,往往说明标题是另一种语言。
可用工具
- search_works:在作品页面中搜索任意位置出现的词,因此标题、作曲家或题献都能找到带有它们的作品。返回包含
page(供get_work使用)、work、composer、page_url、snippet、size_bytes、words、last_edited等行;信封包含returned、has_more和next_offset。total始终为 null,因为图书馆不公布匹配数量。 - search_people:按姓名查找作曲家、编者、改编者和演奏者。图书馆按自己的方式书写姓名(姓氏在前)。返回
category(供get_person和list_person_works使用)、name、page_url、snippet和redirect_to。 - get_work:读取一部作品,返回上述各属性字段,空则为 null,并使用页面原文措辞(例如
ca.1830保持为ca.1830)。还包括genre_categories、external_links、authorities、sections和copyright_summary。 - list_work_files:逐版读取作品的乐谱与录音。一个版本是在同一套条款下发布的一组文件:出版商、编者和版权声明属于该版本。返回
editions,每个含section、publisher_info、editor、copyright和files。文件包含imslp_id、description、format、format_code、pages、size_bytes、downloads、rating、uploader、uploaded_on、扫描图书馆的名称与 sigla,以及blocked(IMSLP 正在审查该文件版权时为 true)。 - list_person_works:读取归在某人物名下的作品。返回包含
page、work、composer、pageid、page_url的行,以及has_more和cursor。total始终为 null。 - get_person:读取某人的资料:页面印出的姓名、所述生活年代、其他归档名、权威登记记录和外部链接。返回
category、catalogued_as、name、life_dates、alternative_names、aliases、authorities、external_links、page_url。 - browse_category:读取归在某分类(体裁、调性、编制或时期)下的作品。返回与
list_person_works相同的行,以及has_more和cursor,total为 null。图书馆一次读取一个分类,因此同时指定体裁和乐器的提问,需要浏览其中一个,并用get_work从每部作品读出另一个。
版权状态
IMSLP 上的乐谱按司法辖区携带状态,图书馆审查加拿大、美国和欧盟。一个文件若显示 Public Domain - Non-PD US,则在加拿大和欧盟自由,在美国受保护。此服务器按发布状态逐辖区报告,在作品的 copyright_summary 和版本的 copyright 下,restrictions 指出声明排除的地方。restrictions 为空并不说明 IMSLP 未纳入审查的国家。
配置
所有变量都是可选的,在客户端配置的 env 块中设置。超出范围的值会回退到默认值,原因写入 stderr。每个失败都携带六种代码之一、一条消息,以及在有帮助时给出下一步的提示。
独立库、节流与署名
读取 IMSLP 的层单独发布,带有自己的节流、缓存和错误处理,不附加协议。renderPage、getWork、search、categoryMembers 和 getPerson 各自返回 { data, cached },并抛出携带六种代码之一的 ImslpError。请求之间的两秒下限在这里同样成立。
IMSLP 在其 robots.txt 中公布 Crawl-delay: 2,因此请求逐个发出、间隔至少两秒,无论服务器如何配置该下限都成立。User-Agent 始终以项目标识和可联系到人的地址结尾。
读取通过 /api.php 的 MediaWiki API 和 IMSLP 在其 IMSLP:API 页面上记录的列表端点进行。robots.txt 禁止 /index.php、/images/、/imglnks/、/wiki/File:、/works 和 /library/,此服务器不在其中任何路径下构造地址:它返回作品页面的链接,也就是回答所署名的来源。
图书馆的页面以 CC BY-SA 4.0 发布,因此此服务器展示的任何内容都署名 IMSLP 并链接其来源页面。
隐私与测试
此服务器不收集你的任何信息,也不向其作者发送任何东西。它在你的机器上运行,只联系 imslp.org,运行时把回答保存在内存中,不写磁盘。PRIVACY.md 说明了请求携带什么以及哪些设置会改变它。
测试针对生成的固定数据运行,不发起网络请求。实时测试套件 npm run test:live 每条路由发起一次请求,每晚针对网站本身运行。
许可
MIT,见 LICENSE。目录与页面归 IMSLP 及其贡献者所有,以 CC BY-SA 4.0 发布。