不和 mcpl 数据
不和-mcpl通过一个bot账户将一个AI代理在Discord上. 这是一个 MCPL 互联网档案馆的存檔,存档日期2013-12-02 服务器。 MCPL( MCP Live) 扩展 示范背景协议 这样服务器除了提供工具外,还可以将频道与主机注册,并推向它的事件. 通过不和-mcpl,代理读取并张贴在Discord频道和DMs中,以及提及bot,回复它或DM的信息,甚至从代理尚未打开的频道到达代理主机.
在康乃馨堆叠, 连接主机 运行代理 代理框架,它开始不和 -mcpl 作为一个孩子的过程, 和它说话 通过stdio。 MCP客户端也可以运行它,作为只提供工具的服务器. 它的协议代码来自 @animalabs/mcpl-core,以及 微缩磁盘 财务报告和审定财务报表 电报-mcpL 是Slack和Telegram的对手.
它会做什么
- 海峡报. discord 频道以 MCPL 为主机 频道,带有表格的标识
discord:<guildId>:<channelId>,或discord:dm:<channelId>一个德国马克。 (一行是Discord的API所称的服务器. ) 主机打开并关闭了频道,不和-mcpl在到达时发送在开通频道中发布的消息,除非代理机已经关闭. - 给机器人的讯息. 不和-mcpl还发出一条信息,提及了bot或它自己的角色,回复了bot的一通信息,或者作为DM而来,无论它的频道是否打开,只要过滤器承认它,并且代理商没有关闭该频道. 抵达时发送的信息携带MCPL 事件标记,例如
chat:mention, (中文(简体) ),chat:reply, (中文(简体) ),chat:dm, (中文(简体) ),chat:ambient财务报告和审定财务报表chat:from-bot,主持人的醒悟政策可以与之相匹配. 编辑时在旁边带有相同的地址标签chat:edited,从消息中读取为编辑,除非其地址不为人知:编辑消息不和.js只保留部分内容,或编辑目标Discord没有发送的回信,不带任何内容. - 编辑,删除和反应. 不相容-mcpl提供DMs和开通频道的编辑和删除,除非代理机已经变音,以及来自正在显示反应能见度的服务器频道的反应. 打开一个频道 毒剂没有关闭它的反应能见度, 关闭它关闭它
set_reaction_visibility. 不和-mcpl不要求Discord的DM反应事件,因此DMs中的反应从未到来. - 附录. 图像到达了内线,仍然有图像缩小到最长一端的1568像素. 文本文件被内入到一个大小限制,默认为5 KiB. 其他文件,以及无法内入的图像,作为带有文件名称,大小和URL的注释而来.
- 休息后补习. 与
DISCORD_WATERMARK_FILE设置, 不相容- mcpl 为它发送的每个频道保存一个追赶位置, 这是它发送或扫描过的最新消息 。 在第一个主机连接后,它读取到DISCORD_CATCHUP_LIMIT在每个保存位置后发送当前过滤器所承认位置的信息。 在DMs和开放频道中,这些频道都是全部,在其他频道中,每个频道都提到机器人,两边最多有7条信息. 代理商哑音的频道没有 发送时主机没有接收的信息 也保存在那里, 稍后发送, 因为Discord有它. - 过滤器. 环境变量或JSON过滤文件选择代理服务器,频道和DM发送器从哪一个接收. 编辑到文件在秒内生效,随着文件的配置,代理服务器和DM列表可以更改
filters_update。没有设置过滤器, 代理从每一个服务器听到 机器人在, 以及任何谁DM它. - 行政指挥. 在列表中的 Discord 用户
DISCORD_ADMIN_USERS可以运行五个斜线命令。 每个都要求主办方通过host/command。代理架构只为配置设置的服务器执行allowHostCommands: true,否则拒绝./undo [messages] [marks]从代理上下文中去除上一封信件(1个默认,最多50个)./hide message [to] [marks]删除信件, 或从信件中删除范围to从代理的背景。 都取一个消息链接或ID.marks打开/undo选择删除的消息获得qq认知标记 :none,默认,addressed或all。宿主放置这些标记,所以/undo需要其代理框架具有marks主机命令(aima-research/agent-framework#250),并在旧主机上被拒绝.marks打开/hide实值none,默认值,或all,它为每个隐藏消息添加了QQ。 这些标记是不和谐的Mcpl自己的,在任何主机上,在主机的分类账外:/marks而不列出它们, 收回只到达一个 在一个消息中./marks action:list [target:<id>] [page:<n>]显示宿主对预定标记的认识分类账,/marks action:cancel target:<id>停止它没有发送/marks action:retract target:<id>排队删除批次标记,或分类账中的每个标记target:all它需要与/undo。 。 。 ./nudge运行当前上下文上的代理,没有新事件./unstick [max]倒转拒绝背后的转折 并再次运行代理 直到模型停止拒绝,最多max时间.
- 声音. 可选的是,不和-mcpl加入一个语音频道,通过"11Labs"来表达代理商的回复,作为主机流. 它在说话前等待沉默,当一个人谈论它时停止,并告诉特工什么是没有听到的. 不译出演说.
- 倒转. 这个
discord.messaging特性集支持 MCPL 倒滚返回检查点后删除、删除和删除后张贴的不协调信息send_message, (中文(简体) ),reply_message或东道主的channels/publish不和谐的mcpl在记忆中保留着检查站,所以它们无法从重启中活下来.
工具
| 特性集 | 工具 |
|---|---|
discord.messaging | send_message, (中文(简体) ), reply_message, (中文(简体) ), send_dm, (中文(简体) ), add_reaction, (中文(简体) ), remove_reaction, (中文(简体) ), edit_message, (中文(简体) ), delete_message, (中文(简体) ), list_emojis |
discord.history | fetch_history, (中文(简体) ), fetch_around |
discord.channels | create_text_channel, (中文(简体) ), delete_channel |
discord.subscriptions | mute_channel, (中文(简体) ), unmute_channel, (中文(简体) ), set_reaction_visibility, (中文(简体) ), list_subscriptions, (中文(简体) ), channel_missed |
| 没有设置特性 | list_guilds, (中文(简体) ), list_channels, (中文(简体) ), list_channel_members, (中文(简体) ), refresh_channels, (中文(简体) ), filters_get, (中文(简体) ), filters_update |
在MCPL模式下,由主机决定哪些功能集被启用. 不和- mcpl 拒绝功能集已禁用的工具, 并禁用 discord.messaging 还阻止Discord消息到达主机. 任何功能集以外的工具总是可用的. MCP客户端获得每个工具,没有Discord消息.
docs/tool-reference.md 向代理解释如何命名频道,选择要操作的信件并附加文件.
设置
1. 创建机器人
- 在那个 Discord 开发者门户,创建应用程序,并从它的 Bot 页面复制此令牌。 这是
DISCORD_TOKEN。 。 。 . - 在同一页,在Privileged Gateway Intents下,打开服务器成员意图和信件内容意图. 不和-mcpl 要求Discord为两者服务.
- 将机器人邀请到您的服务器
bot财务报告和审定财务报表applications.commands瞄准镜。 第二个让不和- mcpl 注册管理员斜线命令 。 在bot应该工作的频道中,允许它查看频道,读取消息历史,发送消息(也用线程),附加文件并添加反应. 与另一服务器的emojis反应,也需要使用外部Emojis,create_text_channel财务报告和审定财务报表delete_channel需要管理频道(管理线索来删除一条线索),语音需要连接和说话.
2. 安装
不和-mcpl需要节点22.12.0或更后.
npm有标记的释放:
npm install @animalabs/discord-mcpl
服务器就是了 node_modules/@animalabs/discord-mcpl/dist/src/index.js,哪个 npx @animalabs/discord-mcpl 运行.
运行 main 无论是现在还是现在,或为此,都从以下来源建立:
git clone https://github.com/anima-research/discord-mcpl.git
cd discord-mcpl
npm ci
npm run build
服务器就是了 dist/src/index.js。 。 。 .
3. 运行
DISCORD_TOKEN=... npx @animalabs/discord-mcpl --stdio
DISCORD_TOKEN=... npx @animalabs/discord-mcpl --tcp 9040
从源检出, 运行 node dist/src/index.js 与同旗相会. npm start -- --stdio 运行 TypeScript 源码,通过 tsx 不构建.
- 与
--stdio,一个主机开始不和-mcpl 和它说话 与stdin和stdout。 当主机关闭连接时不协调- mcpl 退出 . - 与
--tcp <port>,不和-mcpl只听127.0.0.1,一次为一个主机服务,拒绝同时连接的任何其他主机. 它继续登录到主机之间的Discord. 在没有主机连接的情况下到达的信息被丢弃,只有后期读取历史,如第一个主机连接后的赶来,才能带回. 当一个主机开始运行时,它已经在路上被保存到下一个主机,最多一分钟,每次64个消息:主机对一个消息没有回答,在没有说明理由的情况下拒绝,或者拒绝在启动之前的许可,就如同同一事件一样,再次发送给一个已完成启动的主机,广告活动联合,并且可以在它建成时接收这个事件(从未通过一个频道发送过前一个主机打开的);等待其消息的编辑或删除也会被发送到它(见CHANGELOG).
不和- mcpl 将其日志写入 stderr .
用连接主机,在食谱上加入一个条目 mcpServers,正如连接主机的README在"MCP服务器"下所描述的那样. 路径在 args 是服务器的 dist/src/index.js,在源代码或下 node_modules/@animalabs/discord-mcpl/数字 :
"mcpServers": {
"discord": {
"command": "node",
"args": ["/absolute/path/to/dist/src/index.js", "--stdio"],
"env": {
"DISCORD_TOKEN": "${DISCORD_TOKEN}",
"DISCORD_WATERMARK_FILE": "/absolute/path/to/data/discord-watermarks.json"
},
"allowHostCommands": true
}
}
allowHostCommands 让代理框架执行管理员的斜线命令,没有它,代理框架拒绝执行.
默认情况下, connectome-host 给出了 stdio 服务器代理-framework的系统变量允许列表(PATH, (中文(简体) ), HOME, 区域设置等),其条目名称 env和两个它自己设置。 一个是 AGENT_TIMEZONE中替换任何值的 env连接主机从食谱中取出 agent.timezone,除此之外 AGENT_TIMEZONE,则来自其系统时区。 另一个是 DISCORD_SUPPRESSED_REACTIONS_BASELINE,设置为代理框架的拒绝-反应列表,该列表在 env 替换。 命名每个其它可变的不和- mcpl 应见于 env。 。 。 .
配置
不匹配- mcpl 从环境变量读取其配置, 并且只 DISCORD_TOKEN 需要时间。 它不载一 .env 存档. .env.example 提供过滤器和反应-压制变量的更详细信息.
过滤器
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_GUILD_ID | 逗号分离的 Discord 服务器, 代理服务器从中听到 。 一个条目是一个服务器ID, 它承认它的所有频道,或者 serverId:channelId+channelId它只收录那些频道和线索 列出一个类别即承认其下的频道. | 每一个服务器的机器人. |
DISCORD_DM_USERS | 以逗号分隔的用户ID,这些用户可能会对代理进行DM. 不协调的McPL不会从别人那里送去一个DM. 列表只过滤输入的 DMs, 不读取 . | 谁都行. |
DISCORD_FILTERS_FILE | 一个JSON文件持有相同的过滤器,加上下面的反应-抑制列表. 如果启动时文件缺失, 不相容- mcpl 从上面的两个变量创建它 。 如果它存在,它取代它们。 编辑在3秒内生效,以及 filters_update 可以更改其服务器和DM列表. 启动时无法解析的文件如出一辙,两个变量应用到固定为止. 错误的编辑会让过滤器生效 . | 上述两个变量适用,仅在重新启动时更改. |
一个过滤器文件允许一个服务器的每个频道,另一个频道和来自一个用户的DMs:
{
"guildIds": ["111111111111111111", "222222222222222222"],
"guildChannels": { "222222222222222222": ["333333333333333333"] },
"dmUsers": ["444444444444444444"]
}
服务器的频道列表只在 guildIds 列出服务器.
服务器列表决定了哪些服务器的频道不匹配-mcpl 注册并发送信件. 服务器的频道列表也限制代理在那里读取的内容 : list_channels 留下一条通道, list_channel_members, (中文(简体) ), fetch_history, (中文(简体) ), fetch_around 和主机的打开 有回滚拒绝一个, 一个频道名称只解决 它内部的频道. latestFrom,哪个 reply_message, (中文(简体) ), add_reaction 财务报告和审定财务报表 remove_reaction 替换信件ID, 仅在频道中选择信件, 过滤器所允许的 DMs 。 发送到其数字ID给出的频道的信号没有过滤.
当DM名单拒绝DM时,代理商可以通过打电话让发件人知道 filters_update 与 setDmNotice: true。默认情况下取消通知。 他们每24小时最多一次前往每个发送者,所有发送者最多每小时一起前往10次.
存储状态
这些文件允许状态超过重新启动 。 文件没有路径的状态会留在内存中,重启会丢失它.
| 变量 | 它所持有的 | 未设定时 |
|---|---|---|
DISCORD_WATERMARK_FILE | 每个频道的追赶位置(传送或扫描的最新消息),DM频道的不和-mcpl知道,计数 channel_missed 报告,以及主机没有接收的信息,这些信息是后来发送的(owed,只在有一些时才显示). | 固定在内存中,没有追赶;主机没有接收到的消息只在进程运行时稍后才发送. |
DISCORD_SUBSCRIPTIONS_FILE | 遗事. 一个 JSON 的频道 ID 阵列,它一启动就发送消息, 将它们登记为初始打开, 除了代理已关闭的频道。 它读过文件一次,从来没有写过。 文件的路径也设置了后两个文件的默认路径. | 没有频道. |
DISCORD_MUTED_CHANNELS_FILE | 频道变弱了 mute_channel。 。 。 . | 除了订阅文件( E)subs.json 给 subs.muted.json),或者在记忆中,如果这是未设置的也. |
DISCORD_REACTION_CHANNELS_FILE | 反应能见度的渠道,截至其最后的节省. set_reaction_visibility, (中文(简体) ), mute_channel 并关闭频道保存;打开频道不会. | 除了订阅文件( E)subs.json 给 subs.reactions.json),或者在记忆中,如果这是未设置的也. |
DISCORD_DM_NOTICES_FILE | 是否在DM通知上,以及每个发送者的通知限制,没有消息文本. 在文件无法读取或写入时,通知停止. | $XDG_STATE_HOME/discord-mcpl/<bot user ID>/dm-notices.json,与 ~/.local/state 替换 $XDG_STATE_HOME 当它是未设置. |
历史和附件
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_BACKSCROLL_LIMIT | 有多少更早的消息(回滚)会带来从一个DM频道发送的第一个消息,每个注册频道的历史大小会提供主机(capabilities.history.maxMessages),虽然一个宿主的开放回报最多为500. 从一到一万. | 80个 |
DISCORD_BACKSCROLL_CHANNELS | 按逗号分隔的每个通道限制 channelId:n 双对 n 从0到10000。 对于上市频道, n 替换 DISCORD_BACKSCROLL_LIMIT,它也盖 fetch_history, (中文(简体) ), fetch_around (它总是至少返回它所中心的信息)和主机在打开频道时要求的历史. | 无每道所限. |
DISCORD_CATCHUP_LIMIT | 每一个频道都会读到最多的信息。 从一到一万. | 3000个 |
DISCORD_ATTACHMENT_INLINE_MAX_BYTES | 内含的最大文本附件, 以字节表示 . 0 关闭文本内衬,超过 262144 的值等于 262144,无效的值记录出错并给出默认值。 图像没有受到影响. | 第5120号 |
不和- mcpl 读取 DISCORD_BACKSCROLL_LIMIT 财务报告和审定财务报表 DISCORD_CATCHUP_LIMIT,而范围外的值给出了默认值.
管理员命令
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_ADMIN_USERS | 可运行用户的逗号分隔ID /undo, (中文(简体) ), /hide, (中文(简体) ), /marks, (中文(简体) ), /nudge 财务报告和审定财务报表 /unstick。 。 。 . | 没有人可以. |
反应抑制
抑制使所选择的反应的emojis脱离了物剂所看到的:活的反应事件,取出历史和回旋. 与 DISCORD_FILTERS_FILE 设置,列表存在于该文件中为 suppressedReactionEmojis,只修改了文件的编辑。 当不和- mcpl 创建文件时,它会写入适用于它的列表. 启动时无法解析的过滤器文件会将每个反应扣住直到固定. 没有文件,下面的变量会提供列表. 不和- mcpl 在启动时读取了两个变量一次 .
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_SUPPRESSED_REACTIONS_BASELINE | 当过滤器文件没有列表时, 逗号分隔的 emojis 以压制 DISCORD_SUPPRESS_REACTION_EMOJIS 完全没有设定。 设定为空, 该变量关闭基线 . | 没有基线. |
DISCORD_SUPPRESS_REACTION_EMOJIS | 堕地. 列表作为逗号分隔变量, 当过滤器文件没有时使用 suppressedReactionEmojis 键. | 没有使用. |
时间戳
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
AGENT_TIMEZONE | IANA时区,例如 Europe/Berlin,用于写入后补和后补文本的时间。 协议时间戳留在协调世界时. 无效的区域日志警告并给出默认值 . | 系统时区,或UTC. |
AGENT_TIMESTAMP_STYLE | 那些时候的样子如何: full (单位:千美元)2026-01-15T04:34:56-08:00 [America/Los_Angeles], (中文(简体) ), compact (单位:千美元)2026-01-15 04:34, (中文(简体) ), time (单位:千美元)04:34)或(或) none。无效的值记录一个警告并给出 full。 。 。 . | full |
诊断
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_MCPL_DEBUG_LOG | 一个可写取的绝对路径,不相通-mcpl附加符会给诊断线打上时间戳. 它们包括信息文本的节选,每个可达80个字符. | 没有日志. |
语音
声音关闭,除非 DISCORD_VOICE_CHANNEL_ID ,设置它也需要接下来的四个变量。 如果其中的任何一个缺失,或者语音设置失败,不和谐-mcpl日志为什么和运行没有语音. 有声音,不和-mcpl告诉主机 它需要流化的答复(channels.streaming),它会说回音随着流出。 主机仍然照常张贴文本.
| 变量 | 它会做什么 | 未设定时 |
|---|---|---|
DISCORD_VOICE_CHANNEL_ID | 要发言的语音频道的ID. 把声音打开. | 声音关闭了. |
DISCORD_VOICE_GUILD_ID | 语音频道所在的 Discord 服务器的ID . | 语音需要. |
DISCORD_VOICE_REGISTRY_FILE | 一个JSON文件, 在 语音设备注册格式, 将名称映射到 11Labs 声音 . | 语音需要. |
DISCORD_VOICE_NAME | 登记声音,配以其密钥或 discordName,忽略大小写并跳过条目 enabled: false当无相匹配时,不匹配-mcpl使用注册簿的 defaultBotVoice。 。 。 . | 语音需要. |
ELEVENLABS_API_KEY | 十一Labs API 语音合成键. | 语音需要. |
DISCORD_VOICE_TEXT_CHANNELS | 以逗号分隔的回答的文本频道的ID. | 每个频道的答复,包括模式草案. |
DISCORD_VOICE_VAD_DB | 在dBFS中,声音的响度,在语音频道的某个人算作说话的上方. | -45岁 |
DISCORD_VOICE_MAX_HOLD_MS | 最长的回复等待沉默。 不和-mcpl 丢掉一个等待时间更长,不说话的回覆,并告诉特工它没有被听到. | 答如来等已. |
最小的注册名称为一个语音 :
{ "voices": { "my-agent": { "voiceId": "your-elevenlabs-voice-id" } } }
用它,设置 DISCORD_VOICE_NAME=my-agent。 。 。 .
发展
npm run typecheck
npm test # test/*.test.ts in one node --test process, through tsx
npm run build
node --test dist/test/server.test.js # the built server
CI在Ubuntu上用22.12.0节点运行这些. 在有22.12.0节点和最新发行的macOS上,在有24节点和最新发行的Ubuntu上,它安装,构建并检查已建成的服务器在启动时加载所导入的每个模块并到达其检查对象,其语音模块加载.
npm test 在一个过程中运行每个测试文件( q)--experimental-test-isolation=none,节点22.8或以后),并期望服务器自己的 DISCORD_* 变量未设置, 如 CI 有。 因此,测试可以回击它改变的任何全过程状态,例如环境变量,全球或 console钩子放进去 describe: 在文件的顶层, a beforeEach 或者说 afterEach 环绕每个文件的测试,a before 或者说 after 整个运行中一次. test/top-level-hooks.test.ts 在一个行失败 .ts 文件输入 test/ 从其中任何一项开始:
- 钩叫,名字,别名a
node:test导入给它,或者通过诸如test.before· ; - 转让
process.env, (中文(简体) ),console, (中文(简体) ),globalThis或者说global,或直接写在其中之一的财产,例如:globalThis.fetch或者说process.env['X']· ; - (单位:千美元)
delete任何一种,或任何一种; - (单位:千美元)
process添加到监听器on, (中文(简体) ),once, (中文(简体) ),addListener, (中文(简体) ),prependListener或者说prependOnceListener。 。 。 .
它只读出从其中一种平面形式开始的行,所以它看不到一个缩入的行(在顶层块内,或者在被叫作顶层的函数内),在另一个语句后写出,一个通过一个铸件或更长路径的任务(Cast)(globalThis as any).fetch, (中文(简体) ), globalThis.process.env.X),或通过 Object.assign 或者说 Object.defineProperty。 。 。 .
scripts/voice-smoke.ts 在没有主机的直播语音频道中尝试语音输出 。 与 DISCORD_TOKEN, (中文(简体) ), ELEVENLABS_API_KEY 财务报告和审定财务报表 DISCORD_VOICE_REGISTRY_FILE 设定, npx tsx scripts/voice-smoke.ts --guild <serverId> --vc <voiceChannelId> --voice <registry name> 说每行你打, 你可以谈论它,看到它停止. --list 打印服务器和频道.
变动情况 自2026-07-29起记录更改操作员通知.