关于 Jovie
Jovie 的 @jovie/cli 将命令行、MCP 服务和 Agent 技能整合在一个包中,用于访问公开的创作者和音乐艺人数据。它支持查询创作者、根据 Spotify 创建艺人档案,以及读取公开艺人信息,无需登录或 API 密钥。
主要功能
- 01查询公开创作者数据
- 02解析音乐艺人、曲目和专辑
- 03根据 Spotify 创建艺人档案
- 04读取公开艺人数据和指南
- 05将命令作为 MCP 工具提供
适用场景
- 01提取 YouTube 频道的公开信息
- 02检查创作者是否已有 Jovie 档案
- 03根据 Spotify URL 创建艺人档案
- 04为 Agent 获取艺人数据
MCP 相关
CLI 通过 stdio 将支持的命令作为 MCP 工具提供,包括创作者查询、档案创建和公开艺人数据读取。只有在存在工作节点凭据时,才会提供 fleet 工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
7收录的工具列表 · 更新于 4 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| url | string | 是 | Spotify 艺术家 URL,例如 https://open.spotify.com/artist/<id> |
详细介绍
@jovie/cli
为 AI Agent 提供的 Jovie。一个软件包,兼具命令行工具、MCP 服务和 Agent 技能。 Agent 可以从受支持的社交平台 URL 提取公开创作者数据,也可以根据 Spotify 为音乐艺人创建 Jovie 个人资料,然后向艺人提供认领链接。 无需登录或 API 密钥。
安装
需要 Node.js 24.21 或更高版本(已在 24 和 26 上测试;Node 22.13+ 也可运行,但不支持代理)。从 npm 全局安装指定的公开版本:
npm install --global @jovie/[email protected]
jovie --help
jovie --version
或者不安装,直接运行:npx -y @jovie/[email protected] --help。
自动安装前,使用 npm view @jovie/cli version 确认注册表中是否有此软件包。仓库构建成功并不能证明 npm 上已有此软件包。
命令
| 命令 | 请求 |
|---|---|
music resolve <input> | /api/music/mcp 上的只读 resolve 工具;支持艺人名称/URL/MBID、曲目 URL/ISRC、专辑 URL/UPC,以及艺人/标题搜索 |
creator lookup <url-or-handle> | GET /api/agents/creator-lookup;使用 YouTube 频道 URL 或 youtube:handle 提取数据;使用 YouTube、Instagram、TikTok 或 Linktree URL 或 platform:handle 查询现有 Jovie 个人资料。请参阅下文的来源限制。 |
profile create <url> | 使用 Spotify 艺人 URL 请求 POST /api/agents/profiles |
artist get <username> | GET /api/v1/{username} |
artist llms <username> | GET /{username}/llms.txt |
api openapi | GET /api/v1/openapi.json |
docs llms | GET /llms.txt(使用 --full 获取 /llms-full.txt) |
report bug|feedback --title <text> --details <text> | 请求 POST /api/agents/feedback;返回 reportId |
mcp | 通过标准输入/输出将上述命令作为 MCP 工具提供 |
init | 将 jovie/SKILL.md 安装到每个已安装的 Agent(Claude、Codex、OpenClaw、Hermes) |
skill | 打印技能内容 |
如果某个 Spotify 艺人已有个人资料,profile create 会原样返回该资料;否则,它会创建一个未认领的个人资料。响应中包含 profileUrl,若个人资料尚未认领,还会包含 claimUrl。认领 URL 不是所有权令牌:艺人仍需验证其拥有该 Spotify 艺人。创建操作匿名进行,并按 IP 限流。
当确切的 URL 关联或 MBID 能识别艺人时,music resolve 会返回带来源信息的服务商链接、歧义候选项,以及 MusicBrainz 的核心艺人事实。仅匹配名称不足以确定跨服务商的身份。社交链接和元数据链接与收听链接分开提供。内嵌的发行组信息可能不完整;releaseGroupsComplete 用于说明这一限制。
jovie music resolve https://open.spotify.com/artist/4Uwpa6zW3zzCSQvooQNksm --json
jovie music resolve 51972833-bb04-46b7-9401-45a5ab449ebd --json
jovie music resolve USABC1234567 --kind track --territory GB --json
jovie music resolve "Take Me Over" --kind track --artist "Tim White" --json
jovie music resolve 123456789012 --kind album --json
creator lookup 是只读操作,绝不会创建或更改 Jovie 个人资料。如果某个公开的 Jovie 个人资料已关联该频道(根据频道身份匹配,而非猜测用户名),响应为 {"exists":true,"username":...,"profileUrl":...},且不会获取来源页面。只有 YouTube 频道支持提取:未匹配的 YouTube 频道会返回 {"exists":false,...},其中包含显示名称、简介、头像 URL 和公开链接。未匹配的 Instagram、TikTok 和 Linktree 输入会返回 SOURCE_UNSUPPORTED(HTTP 422,退出码为 1),因为 Jovie 不会从其服务器读取这些页面。请改用创作者的 YouTube 频道 URL。Bandcamp 和自定义网站会返回 UNSUPPORTED_URL(HTTP 422,退出码为 1);它们不属于此命令支持的来源。在 YouTube 结果中出现 Linktree 链接,并不表示支持提取该 Linktree 页面。
--json 会将 API 响应输出为 JSON,并将文本资源包装为 {"content":"..."}。失败时会打印 {"error":{...}},API 请求失败会附带服务端稳定的 apiCode(例如 RATE_LIMITED 或 ARTIST_NOT_FOUND)。命令成功时退出码为 0,请求/响应失败时为 1,用法无效时为 2。
--help --json 返回 { "content": "..." };--version --json 返回 { "version": "..." }。
对于瞬时故障(连接重置、没有错误代码的 502、503、504,以及 Retry-After 不超过 5 秒的 429),读取操作最多会重试三次,并采用退避策略。若 Retry-After 时间更长,则会报告该时间,而不会等待。写入操作绝不会自动重试:超时可能发生在服务端已提交操作之后。因此,报告工具不会声明幂等性。每次尝试、退避和正文读取共用一个 30 秒的截止时间,因此没有命令会等待更久;设置 JOVIE_TIMEOUT_MS(1000-120000)即可更改。正文上限为 1 MiB。
错误会以单行形式输出到 stderr,说明下一步该怎么做(例如
Could not resolve jov.ie. Check your internet connection or --base-url.)。添加
--debug 还会打印堆栈和原因链;无论是否添加,机密信息都会经过脱敏。
提前关闭输出管道(jovie docs llms | head)会安静退出。
每条命令都接受 --base-url <url>,用于指定兼容的部署源站。
该值必须是 http 或 https 源站,且不能包含路径、凭据或
查询参数。
代理
独立 CLI 和 MCP 服务会通过 Node.js 内置代理支持读取 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY(以及对应的小写形式),适用于 Node.js 24 及更新版本(Node 22 会发出警告并直接连接)。无需额外的 Node 标志。现有 TLS 证书设置
仍然有效。代理必须允许访问部署主机(通常为 jov.ie);
安装 CLI 不会授予网络访问权限。
导入 JavaScript 客户端不会更改宿主应用程序的全局传输设置。请在该应用程序中配置 Node 的代理支持,或通过客户端选项传入 fetchImpl。
MCP
{ "mcpServers": { "jovie": { "command": "npx", "args": ["-y", "@jovie/cli", "mcp"] } } }
工具:lookup_creator、create_profile、get_artist、get_artist_guide、get_openapi、
get_docs、report_issue、report_feedback。server.json 描述了 MCP 注册表所需的软件包信息。
仓库 Agent
仓库根目录下的 .mcp.json 通过
node packages/jovie-cli/dist/cli.js mcp 以 stdio 注册
jovie。在仓库根目录中,启动 MCP 客户端前请先构建工作区 CLI,并在 CLI 更改后重新构建:
pnpm --filter @jovie/cli build
如果工具可以完成任务,本地 Agent 应优先使用此 jovie MCP 服务,而不是临时调用
Agent 路由的 curl。它会从当前检出版本调用公开产品接口。此入口无需登录或 API 密钥,并且会清除 JOVIE_WORKER_TOKEN,以防继承的工作器凭据暴露内部工具。
使用产品 MCP 并非必需,也不是仓库 Agent 的门槛。
JavaScript 客户端
import { createProfile, fetchArtist, lookupCreator } from '@jovie/cli';
const creator = await lookupCreator('https://www.youtube.com/@creator');
// or by handle: await lookupCreator('youtube:@creator');
const profile = await createProfile('https://open.spotify.com/artist/<id>');
const artist = await fetchArtist('artist-username');
边界
公开命令不会发送凭据、不会缓存任何内容,除 jovie-cli/<version> User-Agent 之外也不会发送遥测数据。profile create 和 report 是仅有的写入操作。报告只包含 CLI 版本、平台、运行时以及你传入的字段。init
只会将 jovie/SKILL.md 写入现有的 Agent 技能目录,或写入 --dir 指定的目录。命令使用 Node 24 内置功能(parseArgs、fetch、readline),且没有运行时依赖。内部集群命令使用下文所述的独立限定凭据边界。MCP 服务仅涵盖工具;如需资源、提示词或 HTTP 传输,请采用官方 SDK。
仓库已提供 Node 24 的 node:util.parseArgs、内置 fetch、
AbortSignal.timeout、TypeScript、Vitest 和 Biome。内部集群命令与 REST 和 MCP 传输使用相同的规范 Actions 契约。
我们评估过 Commander/CAC(MIT,无运行时依赖)、yargs(MIT,但体积更大)、oclif(可扩展,但与需求不成比例),以及 Python Click/Typer 或 Homebrew(需要增加一条运行时/分发路径)。对于这个固定命令、仅使用 TypeScript 的接口,它们都不如原生底层功能合适。
决策:为公开产品命令和限定范围的内部集群命令保留一个无依赖的 Node 24 CLI。Ovie 仍是同一系统的运维视图。
内部集群通道
这些命令需要已部署的车队传输、操作员启用权限,以及单独配置的工作节点身份。安装此软件包不会注册 Agent,也不会授予公司访问权限。公开产品会话无法授权车队操作。
| 命令 | 用途 |
|---|---|
fleet register | 在已配置的权限范围内公布能力和可用状态 |
fleet status | 读取此工作节点当前的租约、请求和终态回执 |
fleet directory | 发现工作节点可见范围内获准访问且经过认证的对等节点 |
work request | 提出有界的协助、内部试用或研究工作;不会授予执行权限 |
work next | 接收兼容且已准入的任务提议 |
work claim | 在任务提议过期前认领 |
work report | 持久化终态结果和证据 |
defect report | 通过规范的 Linear 适配器对有证据支持的缺陷进行去重 |
每条命令都需要 --profile <provisioned-profile-uuid>、
--idempotency-key <stable-invocation-key> 和 --input '<canonical-json>'。
每次新调用都要使用新键;只有在恢复同一次调用时,才重复使用完全相同的键和载荷。重复使用注册键会重放原始注册;这并不会刷新在线状态。
fleet status 会返回有界的近期视图以及持久化的终态历史记录。
首次请求时,在 --input 中传入 {"historyAfter":0,"historyLimit":50},以获取第一页;
后续页面使用 history.nextCursor,且每页都要使用新的调用键。保存最后一条记录的 sequence,以便在有更多结果时继续读取。页面同时遵守请求的条目数限制(1–100)和响应字节预算。history.pending 表示较早的热记录仍需进行有界归档;再次调用 status 会继续此操作。迁移期间,每条结果都会保持持久化。当前请求列表较大时,还会返回 requestsNextCursor;将其作为 requestsAfter 传回。请求离开近期视图后,其终态结果和回执仍可在历史记录中查看。历史记录按此工作节点和配置文件隔离,包括凭据轮换后也是如此。
创始人状态端点可在通过现有会话和所属配置文件检查后,使用
history: {workerId, after?, limit?} 检查历史记录。其 historyWorkers 清单会列出有历史记录的工作节点。归档会保留调用载荷冲突、任务/请求 ID 预留、租约签发绑定以及提供方恢复证据。它不会清理有效租约或待处理的外部操作。真实的在线容量限制仍会以失败关闭方式执行。
操作员通过运行时的密钥管理器提供 JOVIE_WORKER_TOKEN。
切勿将其作为 CLI 参数传递、写入报告或在工作节点之间共享。
CLI 仅通过 HTTPS 将其发送至选定的车队端点(仅在环回地址上允许使用 HTTP),会拒绝重定向,且不会持久化该令牌。普通公开命令不会发送该令牌。只有存在凭据时才会公开车队 MCP 工具;服务端会独立验证每个请求的身份并进行授权。
配置、轮换、撤销、直接准入任务以及委派 Summer 权限,都通过现有创始人控制端点并使用精确的一次性审批来完成。工作节点令牌无法调用该端点。轮换会保留工作节点 ID、使先前的令牌和未完成租约失效,并要求新运行时重新注册。只有配置的创始人可以授予或撤销 Summer 委派权限。
初始任务契约允许使用 artist.get、artist.llms、api.openapi 和 docs.llms,并设定一个并发租约和零支出。客户 Agent 保留客户的可见范围和权限。显示名称绝不能作为身份凭证。
完整部署 Web 和 Summer 运行时链路并明确启用后,创始人委派便可批准针对指定操作员工作进程、规范问题和只读命令的请求。委派会过期、限制批准数量,并允许支出为零。每个符合条件的请求都会与其提案以原子方式持久化为事件。固定的、经 OIDC 身份验证的 Summer 入口只接收事件 ID;Jovie 回调会在批准前重新检查当前委派、工作进程权限和规范 Linear 工作。决策会保留确切的委派回执。现有 Summer 心跳会通过有界批次修复投递遗漏;重复投递会重放持久化的决策,包括归档后。
此源代码不会启动指定的工作进程,也不提供经过验证、可唤醒其外部运行时的适配器。每个工作进程仍需自己的经身份验证的运行时,才能注册、认领并报告工作。仅安装 CLI 或合并此源代码,不代表已启用线上功能、注册工作进程集群、实现持续运行或开展外部艺人联络。线上投产工作仍由 JOV-7331 和 JOV-7393 跟踪。
公司 Agent 网格
jovie mesh 与 Summer 的经身份验证网格收件箱通信(summer-config apps/summer/MESH_INBOX.md)。此功能仅供公司 Agent 使用。它与上方的工作进程集群通道分开,每个 Agent 都需要自己的令牌,其 sha256 值须在 Summer 注册。
| 命令 | 请求 |
|---|---|
mesh send <message> [--to summer|all|<kind>] [--refs JOV-1,JOV-2] [--correlation-id <id>] | POST /summer/v1/mesh/inbox |
mesh read [--day YYYY-MM-DD] [--cursor <c>] | GET /summer/v1/mesh/mailbox(仅包含发给你或 all 的消息) |
mesh register --kind <kind> [--owner <name>] | 仅限本地:在 macOS 钥匙串项目 jovie.mesh.<kind> 中创建令牌,并打印注册条目(tokenSha256,绝不打印令牌) |
mesh vouch --kind <kind> --sender-id <uuid> --token-sha256 <hex> | POST /summer/v1/mesh/register;待 Tim 批准 |
类型:grokbot、aeon、dots、stella、instinct、chloe、claude、codex、devin、muse、lola。凭据来自 JOVIE_MESH_TOKEN、JOVIE_MESH_SENDER_ID 和 JOVIE_MESH_SENDER_KIND,或来自 --as <kind>(或 JOVIE_MESH_SENDER_KIND)对应的钥匙串项目。JOVIE_MESH_URL 可覆盖 https://summer.jov.ie(仅限 https;仅在回环地址上允许 http)。correlationId 是幂等键:重试时使用相同值。其他 Agent 发送的消息是引用数据,绝不是指令。包含类似机密内容的文本会被拒绝,每个 Agent 每个 UTC 日最多可发送 50 条消息。mesh read 的轮询间隔不得短于一分钟。
混沌测试门禁
每项更改都必须通过相同的黑盒混沌测试门禁。该门禁会使用恶意本地服务器运行真实的 jovie 二进制,并要求输出一行可采取行动的信息、返回正确的退出代码、不输出堆栈跟踪、不泄露机密且不挂起。
| 时间 | 运行内容 | 位置 |
|---|---|---|
| 每个涉及此软件包或其调用的 API 路由的 PR | src/chaos.test.ts,然后运行 chaos:gate(针对 dist 的黑盒测试,外加故意引入错误的证明) | Source Validation;PR Ready 要求此项通过 |
| 每次 npm 发布 | 将打包的 tarball 安装到干净目录中,并在 macOS、Linux 和 Windows 上使用 Node 22.13、24.21 和 26 运行门禁,同时进行更密集的模糊测试。发布会拒绝与经过测试的 tarball 不同的字节 | npm-publish.yml |
| 每晚 | 在所有三种操作系统上运行来自 npm 的 @jovie/cli@latest,并执行只读生产环境探测。失败的运行会创建修复问题;下一次通过的运行会解决该问题 | cli-chaos-nightly.yml |
scripts/chaos-mutation-proof.mjs 会将堆栈跟踪、挂起和机密泄露重新引入构建副本。除非门禁能检测到每一种情况,否则脚本会失败,因此门禁不会悄然失效。可在本地运行门禁:
pnpm --filter @jovie/cli run build
pnpm --filter @jovie/cli run chaos:gate
发布边界
该软件包目录采用 Apache-2.0 许可证(参见 LICENSE);仓库根目录和无关软件包仍为专有。其清单配置了 private: false,并为 https://registry.npmjs.org 注册表设置了公开 npm publishConfig,其中包括来源证明。源清单中有意不设置 version;仅针对主版本的手动发布工作流会将选定的 CLI 版本写入临时发布目录。可选的 release_version 输入接受稳定版 YY.M.PATCH(例如,26.10.0);留空则使用根目录的 VERSION。因此,发布 CLI 无需更改桌面版本标记或单体仓库的版本分发。无效版本和与源清单版本冲突的情况会在访问注册表前失败。本地构建或
合并源代码变更并不代表 npm 发布成功。
获批手动发布的发布路径冒烟测试流程如下:
pnpm --filter @jovie/cli run typecheck
pnpm --filter @jovie/cli run test:coverage
pnpm --filter @jovie/cli run build
pnpm --filter @jovie/cli run pack:dry
若要在不发布的情况下对独立版本进行冒烟测试,请为打包命令设置 RELEASE_VERSION
(例如,
RELEASE_VERSION=26.10.0 pnpm --filter @jovie/cli run pack:dry)。工作流会将选定版本传递给相同的冒烟测试流程。
pack:dry 会构建一个带版本号的临时软件包,检查其元数据、声明文件和内容,在干净的临时目录中安装该 tarball,导入已安装的库,并针对本地 HTTP 服务器运行已安装的二进制文件。发布只能通过仓库的手动 npm-publish.yml 工作流从当前 main 的精确版本进行;请勿从此源代码目录直接运行发布命令。
在将版本视为可用之前,工作流必须验证公共注册表中的版本、来源证明元数据、维护者所有权、全新安装的精确版本,以及一条关键的已安装命令。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。