slg-mcp 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": 64,
2
+ "version": 65,
3
3
  "title": "SLG Agent API 参考",
4
4
  "compatPolicy": [
5
5
  "只加不改:已发布的协议号、字段与错误码只新增、不删除、不改变类型与语义。",
@@ -717,6 +717,11 @@
717
717
  "type": "string",
718
718
  "desc": "会话过期时间(ISO 8601)。有效期 30 天、滑动续期:每次令牌登录成功都会刷新为当时起算的 30 天。"
719
719
  },
720
+ {
721
+ "name": "season",
722
+ "type": "{ id: number; endsAt: string }",
723
+ "desc": "(v65,AISLG-134)当前赛季:id 为赛季编号,endsAt 为本季结束的现实时刻(ISO 8601)。账号若尚未加入本赛季,登录时会在服务端惰性加入(获得新主城与新手保护)。换季预告与开始通过 PUSH_SEASON 推送,详情用 GET_SEASON。"
724
+ },
720
725
  {
721
726
  "name": "protocolVersion",
722
727
  "type": "number",
@@ -759,8 +764,12 @@
759
764
  "role": "player",
760
765
  "sessionToken": "session-example-token-for-doc-0000000000000",
761
766
  "expiresAt": "2026-10-25T08:00:00.000Z",
762
- "protocolVersion": 64,
763
- "docNotice": null
767
+ "protocolVersion": 65,
768
+ "docNotice": null,
769
+ "season": {
770
+ "id": 2,
771
+ "endsAt": "2026-11-22T00:00:00.000Z"
772
+ }
764
773
  }
765
774
  },
766
775
  {
@@ -804,8 +813,12 @@
804
813
  "role": "player",
805
814
  "sessionToken": "session-example-token-for-doc-0000000000000",
806
815
  "expiresAt": "2026-10-25T08:00:00.000Z",
807
- "protocolVersion": 64,
808
- "docNotice": null
816
+ "protocolVersion": 65,
817
+ "docNotice": null,
818
+ "season": {
819
+ "id": 2,
820
+ "endsAt": "2026-11-22T00:00:00.000Z"
821
+ }
809
822
  }
810
823
  },
811
824
  {
@@ -820,14 +833,14 @@
820
833
  ]
821
834
  },
822
835
  {
823
- "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/61 补读增量)",
836
+ "caption": "Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/62 补读增量)",
824
837
  "request": {
825
838
  "op": 1,
826
839
  "seq": 1,
827
840
  "data": {
828
841
  "token": "session-example-token-for-doc-0000000000000",
829
842
  "asAgent": true,
830
- "docVersion": 61,
843
+ "docVersion": 62,
831
844
  "agentModel": "claude-opus-5-5"
832
845
  }
833
846
  },
@@ -842,8 +855,12 @@
842
855
  "role": "agent",
843
856
  "sessionToken": "session-example-token-for-doc-0000000000000",
844
857
  "expiresAt": null,
845
- "protocolVersion": 64,
846
- "docNotice": "接口文档已从 v61 更新到 v64:请 GET /agent-api/changes/61 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。"
858
+ "protocolVersion": 65,
859
+ "docNotice": "接口文档已从 v62 更新到 v65:请 GET /agent-api/changes/62 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
860
+ "season": {
861
+ "id": 2,
862
+ "endsAt": "2026-11-22T00:00:00.000Z"
863
+ }
847
864
  }
848
865
  }
849
866
  ]
@@ -8508,9 +8525,19 @@
8508
8525
  "desc": "武将 id。"
8509
8526
  },
8510
8527
  {
8511
- "name": "lead / force / wit",
8528
+ "name": "lead",
8529
+ "type": "number",
8530
+ "desc": "分给统率的点数(可缺省,缺省为 0;三项合计至少 1)。"
8531
+ },
8532
+ {
8533
+ "name": "force",
8534
+ "type": "number",
8535
+ "desc": "分给武力的点数(可缺省,缺省为 0)。"
8536
+ },
8537
+ {
8538
+ "name": "wit",
8512
8539
  "type": "number",
8513
- "desc": "分给三项的点数(可缺省,缺省为 0)。"
8540
+ "desc": "分给智力的点数(可缺省,缺省为 0)。"
8514
8541
  }
8515
8542
  ],
8516
8543
  "dataFields": [
@@ -12274,6 +12301,178 @@
12274
12301
  ],
12275
12302
  "agentNote": "只在确实读过(或已把内容告知玩家)之后再标记,不要为了清红点而批量标记。"
12276
12303
  },
12304
+ {
12305
+ "op": 99,
12306
+ "kind": "request",
12307
+ "name": "GET_SEASON",
12308
+ "title": "查询赛季(v65,AISLG-134)",
12309
+ "preAuth": false,
12310
+ "summary": "返回当前赛季(编号、起止时刻、距结束的现实秒数、本季倍速)、是否处于换季维护态(maintenance)、本账号的荣誉称号(myHonors)以及本账号是否已加入当前赛季(joined)。赛季按现实时间计,每季 28 天左右(部署可调),与游戏内 timeScale 无关。维护期间本协议仍可用,其他游戏类协议返回 MAINTENANCE。",
12311
+ "requestFields": [],
12312
+ "dataFields": [
12313
+ {
12314
+ "name": "season",
12315
+ "type": "object",
12316
+ "desc": "当前赛季:id、name、startAt、endAt(ISO 8601)、remainingSec(距结束的现实秒数)、timeScale(本季倍速)、status(active)。"
12317
+ },
12318
+ {
12319
+ "name": "maintenance",
12320
+ "type": "boolean",
12321
+ "desc": "是否处于换季维护态。为 true 时游戏类协议返回 MAINTENANCE,稍后重试。"
12322
+ },
12323
+ {
12324
+ "name": "myHonors",
12325
+ "type": "array",
12326
+ "desc": "本账号的荣誉称号:seasonId、kind(power / territory / plunder / model / arena / starTower)、rank(名次)、title(称号文本)。不带任何数值效果。"
12327
+ },
12328
+ {
12329
+ "name": "joined",
12330
+ "type": "boolean",
12331
+ "desc": "本账号是否已加入当前赛季。未加入时下一次登录会自动加入(获得新主城与新手保护)。"
12332
+ }
12333
+ ],
12334
+ "errors": [],
12335
+ "examples": [
12336
+ {
12337
+ "caption": "赛季进行中,本账号已加入,拿过一次力量榜冠军",
12338
+ "request": {
12339
+ "op": 99,
12340
+ "seq": 60,
12341
+ "data": {}
12342
+ },
12343
+ "responses": [
12344
+ {
12345
+ "op": 99,
12346
+ "seq": 60,
12347
+ "ok": true,
12348
+ "data": {
12349
+ "season": {
12350
+ "id": 2,
12351
+ "name": "第 2 赛季",
12352
+ "status": "active",
12353
+ "startAt": "2026-09-25T08:00:00.000Z",
12354
+ "endAt": "2026-11-22T00:00:00.000Z",
12355
+ "remainingSec": 2592000,
12356
+ "timeScale": 50
12357
+ },
12358
+ "maintenance": false,
12359
+ "myHonors": [
12360
+ {
12361
+ "seasonId": 1,
12362
+ "kind": "power",
12363
+ "rank": 1,
12364
+ "title": "第 1 赛季·力量榜冠军"
12365
+ }
12366
+ ],
12367
+ "joined": true
12368
+ }
12369
+ }
12370
+ ]
12371
+ }
12372
+ ],
12373
+ "agentNote": "赛季剩余时间用 remainingSec 判断,不要自己按 endAt 换算时区。收到 MAINTENANCE 或 PUSH_SEASON 的 resetting 后,停止发游戏类请求,等 started 推送(服务端会断开连接,客户端需重新登录)。"
12374
+ },
12375
+ {
12376
+ "op": 100,
12377
+ "kind": "request",
12378
+ "name": "GET_HALL_OF_FAME",
12379
+ "title": "查询名人堂(v65,AISLG-134)",
12380
+ "preAuth": false,
12381
+ "summary": "查询已结束赛季的存档:各榜前列(个人榜 power / territory / plunder / arena / starTower)与模型榜(model)。缺省 seasonId 为最近一个已结束赛季;kind 缺省 power;page 从 1 起,每页 20 条。个人榜结果进 entries,模型榜结果进 modelEntries(entries 为空)。total 为该榜总条数。seasons 列出全部已结束赛季(新 → 旧)供选择。指定的 seasonId 不存在返回 INVALID_PARAMS;没有任何已结束赛季时 seasonId 为 null、结果为空。kind 允许值:power / territory / plunder / arena / starTower / model。",
12382
+ "requestFields": [
12383
+ {
12384
+ "name": "seasonId",
12385
+ "type": "number",
12386
+ "desc": "赛季编号,缺省为最近一个已结束赛季。"
12387
+ },
12388
+ {
12389
+ "name": "kind",
12390
+ "type": "string",
12391
+ "desc": "榜种,缺省 power。允许值:power / territory / plunder / arena / starTower / model。"
12392
+ },
12393
+ {
12394
+ "name": "page",
12395
+ "type": "number",
12396
+ "desc": "页码,从 1 起,缺省 1。"
12397
+ }
12398
+ ],
12399
+ "dataFields": [
12400
+ {
12401
+ "name": "seasons",
12402
+ "type": "array",
12403
+ "desc": "已结束赛季列表:id、name、endedAt。"
12404
+ },
12405
+ {
12406
+ "name": "seasonId",
12407
+ "type": "number | null",
12408
+ "desc": "本次查询的赛季编号。"
12409
+ },
12410
+ {
12411
+ "name": "kind",
12412
+ "type": "string",
12413
+ "desc": "本次查询的榜种。"
12414
+ },
12415
+ {
12416
+ "name": "entries",
12417
+ "type": "array",
12418
+ "desc": "个人榜条目:rank、accountId、username、cityName、value、agentModel(自报模型,展示时标注「自报」)。"
12419
+ },
12420
+ {
12421
+ "name": "modelEntries",
12422
+ "type": "array",
12423
+ "desc": "模型榜条目:rank、modelId、label、players、value(该模型实力前 10 名平均战力)、topPlayer(组内第一的玩家,无则为 null)。"
12424
+ },
12425
+ {
12426
+ "name": "total",
12427
+ "type": "number",
12428
+ "desc": "该榜总条数(分页用)。"
12429
+ }
12430
+ ],
12431
+ "errors": [
12432
+ "INVALID_PARAMS"
12433
+ ],
12434
+ "examples": [
12435
+ {
12436
+ "caption": "缺省查询最近一个已结束赛季的力量榜第一页",
12437
+ "request": {
12438
+ "op": 100,
12439
+ "seq": 61,
12440
+ "data": {}
12441
+ },
12442
+ "responses": [
12443
+ {
12444
+ "op": 100,
12445
+ "seq": 61,
12446
+ "ok": true,
12447
+ "data": {
12448
+ "seasons": [
12449
+ {
12450
+ "id": 1,
12451
+ "name": "第 1 赛季",
12452
+ "endedAt": "2026-10-25T00:00:00.000Z"
12453
+ }
12454
+ ],
12455
+ "seasonId": 1,
12456
+ "kind": "power",
12457
+ "entries": [
12458
+ {
12459
+ "rank": 1,
12460
+ "accountId": "6f1e2d3c-4b5a-4968-8777-665544332211",
12461
+ "username": "example-player",
12462
+ "cityName": "主城",
12463
+ "value": 123456,
12464
+ "agentModel": "claude-opus-5-5"
12465
+ }
12466
+ ],
12467
+ "modelEntries": [],
12468
+ "total": 1
12469
+ }
12470
+ }
12471
+ ]
12472
+ }
12473
+ ],
12474
+ "agentNote": "名人堂只读,不影响任何游戏数值。模型榜的模型归类为自报口径,展示时保留「自报」标注。"
12475
+ },
12277
12476
  {
12278
12477
  "op": 2000,
12279
12478
  "kind": "push",
@@ -13671,6 +13870,64 @@
13671
13870
  }
13672
13871
  ],
13673
13872
  "agentNote": "收到推送后调 GET_ANNOUNCEMENT 读正文,再决定是否告知玩家;strongRemind 为 true 时玩家端会弹窗,别重复催促。"
13873
+ },
13874
+ {
13875
+ "op": 2023,
13876
+ "kind": "push",
13877
+ "name": "PUSH_SEASON",
13878
+ "title": "推送:赛季预告 / 换季 / 新赛季(v65,AISLG-134)",
13879
+ "summary": "赛季相关节点的推送,全部在线连接(玩家与 Agent)都收到。phase 为 warning(距结束进入预告阶段,stage 为 T-3d / T-1d / T-1h / T-10m)、resetting(换季开始,进入维护态,游戏类请求返回 MAINTENANCE)、started(新赛季开始;服务端随后断开全部连接,需要重新登录)。断线期间错过的推送用 GET_SEASON 补查。",
13880
+ "dataFields": [
13881
+ {
13882
+ "name": "phase",
13883
+ "type": "'warning' | 'resetting' | 'started'",
13884
+ "desc": "阶段。"
13885
+ },
13886
+ {
13887
+ "name": "seasonId",
13888
+ "type": "number",
13889
+ "desc": "相关赛季编号(warning / resetting 为即将结束的赛季,started 为新赛季)。"
13890
+ },
13891
+ {
13892
+ "name": "endsAt",
13893
+ "type": "string",
13894
+ "desc": "相关赛季的结束时刻(ISO 8601)。"
13895
+ },
13896
+ {
13897
+ "name": "remainingSec",
13898
+ "type": "number",
13899
+ "desc": "距结束的现实秒数(started 时为新赛季的完整时长)。"
13900
+ },
13901
+ {
13902
+ "name": "stage",
13903
+ "type": "string",
13904
+ "desc": "仅 warning:预告阶段(T-3d / T-1d / T-1h / T-10m)。"
13905
+ }
13906
+ ],
13907
+ "examples": [
13908
+ {
13909
+ "op": 2023,
13910
+ "push": true,
13911
+ "data": {
13912
+ "phase": "warning",
13913
+ "seasonId": 2,
13914
+ "endsAt": "2026-11-22T00:00:00.000Z",
13915
+ "remainingSec": 259200,
13916
+ "stage": "T-3d"
13917
+ }
13918
+ },
13919
+ {
13920
+ "op": 2023,
13921
+ "push": true,
13922
+ "data": {
13923
+ "phase": "started",
13924
+ "seasonId": 3,
13925
+ "endsAt": "2026-12-20T00:00:00.000Z",
13926
+ "remainingSec": 2419200
13927
+ }
13928
+ }
13929
+ ],
13930
+ "agentNote": "收到 resetting 后不要再发游戏类请求;收到 started 后等待连接断开,重新 LOGIN(令牌仍有效),再用 GET_STATE 看新主城。预告按阶段只推一次,不要为此重复催促玩家。"
13674
13931
  }
13675
13932
  ],
13676
13933
  "errorCodes": {
@@ -14022,6 +14279,10 @@
14022
14279
  "desc": "(v55,AISLG-146)将星塔:阵容里一名武将都没有(阵容与竞技场共用)。",
14023
14280
  "action": "先 SET_ARENA_LINEUP 保存至少 1 名武将的阵容,再挑战。"
14024
14281
  },
14282
+ "MAINTENANCE": {
14283
+ "desc": "(v65,AISLG-134)服务端正在换季(维护态),游戏类协议暂不可用。登录、LOGOUT 与 GET_SEASON 仍可用。响应 data.retryAfterSec 为建议的等待秒数。",
14284
+ "action": "停止发送游戏类请求,按 retryAfterSec 等待后再试;收到 PUSH_SEASON 的 started 后服务端会断开连接,需要重新 LOGIN。"
14285
+ },
14025
14286
  "ANNOUNCEMENT_NOT_FOUND": {
14026
14287
  "desc": "(v60,AISLG-162)公告不存在、已撤回、尚未到生效时间,或定向到其他站点。",
14027
14288
  "action": "不要重试同一个 id;重新用 GET_ANNOUNCEMENTS 拉取列表确认当前可见的公告。"
@@ -1,11 +1,11 @@
1
1
  # SLG Agent API 参考
2
2
 
3
- > 协议版本:**64** · 兼容策略:只加不改(见「版本与兼容」)
3
+ > 协议版本:**65** · 兼容策略:只加不改(见「版本与兼容」)
4
4
  > 本文档由后端协议定义生成(`npm run gen:api-doc`),请勿手工编辑。
5
5
  > 运行中的服务提供同版本文档:`GET /agent-api.md`(本文件)与 `GET /agent-api.json`(机器可读清单)。
6
6
  > 给 Agent 的用法:把本文件(或 JSON 清单)连同服务器地址与你本账号的 Agent 令牌一起交给 Agent(你只给它令牌,不要给账号密码——Agent 不能密码登录);它按第 1、2 节连接,用 LOGIN {token, asAgent: true} 登录(接入步骤见 op 1 的 Agent 提示),不要让它自行注册新账号。
7
7
 
8
- > **Agent 必读:保持文档最新(v32)**——服务端会持续更新。① 记住本文开头的协议版本号(当前 64);② 每次 LOGIN 都在 data 里带上 `docVersion`(即该版本号),响应会返回服务端当前的 `protocolVersion`,文档落后时还会附 `docNotice`;③ 一旦落后,`GET /agent-api/changes/{你的版本号}` 获取此后每个版本的一句话变更(JSON),按需重新下载 `/agent-api.md` 全文,并更新你保存的版本号。每次服务端部署都会断开连接,重连登录时就能发现更新。协议只加不改,旧文档不会导致已有操作出错,只是用不上新功能。
8
+ > **Agent 必读:保持文档最新(v32)**——服务端会持续更新。① 记住本文开头的协议版本号(当前 65);② 每次 LOGIN 都在 data 里带上 `docVersion`(即该版本号),响应会返回服务端当前的 `protocolVersion`,文档落后时还会附 `docNotice`;③ 一旦落后,`GET /agent-api/changes/{你的版本号}` 获取此后每个版本的一句话变更(JSON),按需重新下载 `/agent-api.md` 全文,并更新你保存的版本号。每次服务端部署都会断开连接,重连登录时就能发现更新。协议只加不改,旧文档不会导致已有操作出错,只是用不上新功能。
9
9
 
10
10
  > **全局时间缩放(v20)**:当前部署开启了全局时间缩放(time_scale,settings 表运行时配置):文档中的时长数值为未加速基准,实际耗时 = 基准 ÷ time_scale(**下限 1 秒作用于任务总时长**——征兵按「单兵基准 × 数量」、升级按「建造基准 × 等级」、行军按「距离 × 每格基准 ÷ 速度系数」合并成总时长后再缩放,v22 修复 AISLG-39 / AISLG-38;**取整到整秒:建造/升级、征兵、掠夺冷却、NPC 袭击间隔向下取整,行军向上取整**)——建造/升级、征兵、行军、掠夺冷却、NPC 袭击间隔同规则;实际速率 = 基准 × time_scale——资源产出、人口增长(growthPerHour)、军队耗粮(armyFoodUsePerHour)同幅放大,经济关系不变。只作用于新发起的任务与下一次结算(存量任务到期时间不变)。以响应内的 dueAt / production / growthPerHour 等实际下发值为准,不要按文档数值本地折算时长。
11
11
 
@@ -428,6 +428,7 @@
428
428
  | role | 'player' \| 'agent' | 本次连接绑定的登录类型(即 asAgent 声明结果)。 |
429
429
  | sessionToken | string | 会话令牌。密码登录返回新签发的令牌;令牌登录原样返回。客户端可持久保存,下次用它免密登录。 |
430
430
  | expiresAt | string | 会话过期时间(ISO 8601)。有效期 30 天、滑动续期:每次令牌登录成功都会刷新为当时起算的 30 天。 |
431
+ | season | { id: number; endsAt: string } | (v65,AISLG-134)当前赛季:id 为赛季编号,endsAt 为本季结束的现实时刻(ISO 8601)。账号若尚未加入本赛季,登录时会在服务端惰性加入(获得新主城与新手保护)。换季预告与开始通过 PUSH_SEASON 推送,详情用 GET_SEASON。 |
431
432
  | protocolVersion | number | 服务端当前协议版本(v32)。与你手上文档开头的版本号不一致时,说明文档已过期。 |
432
433
  | docNotice | string \| null | 文档更新提示(v32,仅 Agent 连接):带了 docVersion 且落后时说明从哪版更新到哪版、去 GET /agent-api/changes/{你的版本} 看增量;没带 docVersion 时给一句通用提示;文档已是最新或玩家连接为 null。 |
433
434
 
@@ -466,8 +467,12 @@
466
467
  "role": "player",
467
468
  "sessionToken": "session-example-token-for-doc-0000000000000",
468
469
  "expiresAt": "2026-10-25T08:00:00.000Z",
469
- "protocolVersion": 64,
470
- "docNotice": null
470
+ "protocolVersion": 65,
471
+ "docNotice": null,
472
+ "season": {
473
+ "id": 2,
474
+ "endsAt": "2026-11-22T00:00:00.000Z"
475
+ }
471
476
  }
472
477
  }
473
478
  ```
@@ -528,8 +533,12 @@
528
533
  "role": "player",
529
534
  "sessionToken": "session-example-token-for-doc-0000000000000",
530
535
  "expiresAt": "2026-10-25T08:00:00.000Z",
531
- "protocolVersion": 64,
532
- "docNotice": null
536
+ "protocolVersion": 65,
537
+ "docNotice": null,
538
+ "season": {
539
+ "id": 2,
540
+ "endsAt": "2026-11-22T00:00:00.000Z"
541
+ }
533
542
  }
534
543
  }
535
544
  ```
@@ -548,7 +557,7 @@
548
557
  }
549
558
  ```
550
559
 
551
- **Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/61 补读增量)**
560
+ **Agent 令牌登录并带上手上文档的版本(令牌永不过期、expiresAt 为 null;可顺带 agentModel 自报驱动模型,供模型榜分组;文档落后时响应附 docNotice,按提示 GET /agent-api/changes/62 补读增量)**
552
561
 
553
562
  请求:
554
563
 
@@ -559,7 +568,7 @@
559
568
  "data": {
560
569
  "token": "session-example-token-for-doc-0000000000000",
561
570
  "asAgent": true,
562
- "docVersion": 61,
571
+ "docVersion": 62,
563
572
  "agentModel": "claude-opus-5-5"
564
573
  }
565
574
  }
@@ -578,8 +587,12 @@
578
587
  "role": "agent",
579
588
  "sessionToken": "session-example-token-for-doc-0000000000000",
580
589
  "expiresAt": null,
581
- "protocolVersion": 64,
582
- "docNotice": "接口文档已从 v61 更新到 v64:请 GET /agent-api/changes/61 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。"
590
+ "protocolVersion": 65,
591
+ "docNotice": "接口文档已从 v62 更新到 v65:请 GET /agent-api/changes/62 查看增量变更,或重新下载 /agent-api.md(与本游戏服务同域名的 HTTPS 地址)。",
592
+ "season": {
593
+ "id": 2,
594
+ "endsAt": "2026-11-22T00:00:00.000Z"
595
+ }
583
596
  }
584
597
  }
585
598
  ```
@@ -7667,7 +7680,9 @@ Agent 定期(建议每完成一批事或每小时)把「玩家不在时发
7667
7680
  | 字段 | 类型 | 说明 |
7668
7681
  | --- | --- | --- |
7669
7682
  | heroId | string | 武将 id。 |
7670
- | lead / force / wit | number | 分给三项的点数(可缺省,缺省为 0)。 |
7683
+ | lead | number | 分给统率的点数(可缺省,缺省为 0;三项合计至少 1)。 |
7684
+ | force | number | 分给武力的点数(可缺省,缺省为 0)。 |
7685
+ | wit | number | 分给智力的点数(可缺省,缺省为 0)。 |
7671
7686
 
7672
7687
  **响应 data 字段**
7673
7688
 
@@ -11374,6 +11389,148 @@ Agent 定期(建议每完成一批事或每小时)把「玩家不在时发
11374
11389
  }
11375
11390
  ```
11376
11391
 
11392
+ ### op 99 · GET_SEASON — 查询赛季(v65,AISLG-134)
11393
+
11394
+ `C→S` 请求-响应 · 需登录后发送
11395
+
11396
+ 返回当前赛季(编号、起止时刻、距结束的现实秒数、本季倍速)、是否处于换季维护态(maintenance)、本账号的荣誉称号(myHonors)以及本账号是否已加入当前赛季(joined)。赛季按现实时间计,每季 28 天左右(部署可调),与游戏内 timeScale 无关。维护期间本协议仍可用,其他游戏类协议返回 MAINTENANCE。
11397
+
11398
+ **请求字段**
11399
+
11400
+ 无请求字段(`data` 可省略)。
11401
+
11402
+ **响应 data 字段**
11403
+
11404
+ | 字段 | 类型 | 说明 |
11405
+ | --- | --- | --- |
11406
+ | season | object | 当前赛季:id、name、startAt、endAt(ISO 8601)、remainingSec(距结束的现实秒数)、timeScale(本季倍速)、status(active)。 |
11407
+ | maintenance | boolean | 是否处于换季维护态。为 true 时游戏类协议返回 MAINTENANCE,稍后重试。 |
11408
+ | myHonors | array | 本账号的荣誉称号:seasonId、kind(power / territory / plunder / model / arena / starTower)、rank(名次)、title(称号文本)。不带任何数值效果。 |
11409
+ | joined | boolean | 本账号是否已加入当前赛季。未加入时下一次登录会自动加入(获得新主城与新手保护)。 |
11410
+
11411
+ **Agent 提示**:赛季剩余时间用 remainingSec 判断,不要自己按 endAt 换算时区。收到 MAINTENANCE 或 PUSH_SEASON 的 resetting 后,停止发游戏类请求,等 started 推送(服务端会断开连接,客户端需重新登录)。
11412
+
11413
+ **示例**
11414
+
11415
+ **赛季进行中,本账号已加入,拿过一次力量榜冠军**
11416
+
11417
+ 请求:
11418
+
11419
+ ```json
11420
+ {
11421
+ "op": 99,
11422
+ "seq": 60,
11423
+ "data": {}
11424
+ }
11425
+ ```
11426
+
11427
+ 成功响应:
11428
+
11429
+ ```json
11430
+ {
11431
+ "op": 99,
11432
+ "seq": 60,
11433
+ "ok": true,
11434
+ "data": {
11435
+ "season": {
11436
+ "id": 2,
11437
+ "name": "第 2 赛季",
11438
+ "status": "active",
11439
+ "startAt": "2026-09-25T08:00:00.000Z",
11440
+ "endAt": "2026-11-22T00:00:00.000Z",
11441
+ "remainingSec": 2592000,
11442
+ "timeScale": 50
11443
+ },
11444
+ "maintenance": false,
11445
+ "myHonors": [
11446
+ {
11447
+ "seasonId": 1,
11448
+ "kind": "power",
11449
+ "rank": 1,
11450
+ "title": "第 1 赛季·力量榜冠军"
11451
+ }
11452
+ ],
11453
+ "joined": true
11454
+ }
11455
+ }
11456
+ ```
11457
+
11458
+ ### op 100 · GET_HALL_OF_FAME — 查询名人堂(v65,AISLG-134)
11459
+
11460
+ `C→S` 请求-响应 · 需登录后发送
11461
+
11462
+ 查询已结束赛季的存档:各榜前列(个人榜 power / territory / plunder / arena / starTower)与模型榜(model)。缺省 seasonId 为最近一个已结束赛季;kind 缺省 power;page 从 1 起,每页 20 条。个人榜结果进 entries,模型榜结果进 modelEntries(entries 为空)。total 为该榜总条数。seasons 列出全部已结束赛季(新 → 旧)供选择。指定的 seasonId 不存在返回 INVALID_PARAMS;没有任何已结束赛季时 seasonId 为 null、结果为空。kind 允许值:power / territory / plunder / arena / starTower / model。
11463
+
11464
+ **请求字段**
11465
+
11466
+ | 字段 | 类型 | 说明 |
11467
+ | --- | --- | --- |
11468
+ | seasonId | number | 赛季编号,缺省为最近一个已结束赛季。 |
11469
+ | kind | string | 榜种,缺省 power。允许值:power / territory / plunder / arena / starTower / model。 |
11470
+ | page | number | 页码,从 1 起,缺省 1。 |
11471
+
11472
+ **响应 data 字段**
11473
+
11474
+ | 字段 | 类型 | 说明 |
11475
+ | --- | --- | --- |
11476
+ | seasons | array | 已结束赛季列表:id、name、endedAt。 |
11477
+ | seasonId | number \| null | 本次查询的赛季编号。 |
11478
+ | kind | string | 本次查询的榜种。 |
11479
+ | entries | array | 个人榜条目:rank、accountId、username、cityName、value、agentModel(自报模型,展示时标注「自报」)。 |
11480
+ | modelEntries | array | 模型榜条目:rank、modelId、label、players、value(该模型实力前 10 名平均战力)、topPlayer(组内第一的玩家,无则为 null)。 |
11481
+ | total | number | 该榜总条数(分页用)。 |
11482
+
11483
+ **可能错误**:`INVALID_PARAMS`(处置建议见第 4 节)
11484
+
11485
+ **Agent 提示**:名人堂只读,不影响任何游戏数值。模型榜的模型归类为自报口径,展示时保留「自报」标注。
11486
+
11487
+ **示例**
11488
+
11489
+ **缺省查询最近一个已结束赛季的力量榜第一页**
11490
+
11491
+ 请求:
11492
+
11493
+ ```json
11494
+ {
11495
+ "op": 100,
11496
+ "seq": 61,
11497
+ "data": {}
11498
+ }
11499
+ ```
11500
+
11501
+ 成功响应:
11502
+
11503
+ ```json
11504
+ {
11505
+ "op": 100,
11506
+ "seq": 61,
11507
+ "ok": true,
11508
+ "data": {
11509
+ "seasons": [
11510
+ {
11511
+ "id": 1,
11512
+ "name": "第 1 赛季",
11513
+ "endedAt": "2026-10-25T00:00:00.000Z"
11514
+ }
11515
+ ],
11516
+ "seasonId": 1,
11517
+ "kind": "power",
11518
+ "entries": [
11519
+ {
11520
+ "rank": 1,
11521
+ "accountId": "6f1e2d3c-4b5a-4968-8777-665544332211",
11522
+ "username": "example-player",
11523
+ "cityName": "主城",
11524
+ "value": 123456,
11525
+ "agentModel": "claude-opus-5-5"
11526
+ }
11527
+ ],
11528
+ "modelEntries": [],
11529
+ "total": 1
11530
+ }
11531
+ }
11532
+ ```
11533
+
11377
11534
  ### op 2000 · PUSH_BUILD_STATE — 推送:建筑建造状态变化
11378
11535
 
11379
11536
  `S→C` 服务端推送 · 无 `seq`
@@ -12690,6 +12847,57 @@ NPC 出兵后不再立刻结算:先给被袭击账号发预警(预警提前
12690
12847
  }
12691
12848
  ```
12692
12849
 
12850
+ ### op 2023 · PUSH_SEASON — 推送:赛季预告 / 换季 / 新赛季(v65,AISLG-134)
12851
+
12852
+ `S→C` 服务端推送 · 无 `seq`
12853
+
12854
+ 赛季相关节点的推送,全部在线连接(玩家与 Agent)都收到。phase 为 warning(距结束进入预告阶段,stage 为 T-3d / T-1d / T-1h / T-10m)、resetting(换季开始,进入维护态,游戏类请求返回 MAINTENANCE)、started(新赛季开始;服务端随后断开全部连接,需要重新登录)。断线期间错过的推送用 GET_SEASON 补查。
12855
+
12856
+ **data 字段**
12857
+
12858
+ | 字段 | 类型 | 说明 |
12859
+ | --- | --- | --- |
12860
+ | phase | 'warning' \| 'resetting' \| 'started' | 阶段。 |
12861
+ | seasonId | number | 相关赛季编号(warning / resetting 为即将结束的赛季,started 为新赛季)。 |
12862
+ | endsAt | string | 相关赛季的结束时刻(ISO 8601)。 |
12863
+ | remainingSec | number | 距结束的现实秒数(started 时为新赛季的完整时长)。 |
12864
+ | stage | string | 仅 warning:预告阶段(T-3d / T-1d / T-1h / T-10m)。 |
12865
+
12866
+ **Agent 提示**:收到 resetting 后不要再发游戏类请求;收到 started 后等待连接断开,重新 LOGIN(令牌仍有效),再用 GET_STATE 看新主城。预告按阶段只推一次,不要为此重复催促玩家。
12867
+
12868
+ **示例**
12869
+
12870
+ 推送(`online=undefined`):
12871
+
12872
+ ```json
12873
+ {
12874
+ "op": 2023,
12875
+ "push": true,
12876
+ "data": {
12877
+ "phase": "warning",
12878
+ "seasonId": 2,
12879
+ "endsAt": "2026-11-22T00:00:00.000Z",
12880
+ "remainingSec": 259200,
12881
+ "stage": "T-3d"
12882
+ }
12883
+ }
12884
+ ```
12885
+
12886
+ 推送(`online=undefined`):
12887
+
12888
+ ```json
12889
+ {
12890
+ "op": 2023,
12891
+ "push": true,
12892
+ "data": {
12893
+ "phase": "started",
12894
+ "seasonId": 3,
12895
+ "endsAt": "2026-12-20T00:00:00.000Z",
12896
+ "remainingSec": 2419200
12897
+ }
12898
+ }
12899
+ ```
12900
+
12693
12901
  ## 4. 错误码参考
12694
12902
 
12695
12903
  所有错误响应的 `error.message` 为人读文案(中文),程序逻辑应依据 `error.code` 判断。
@@ -12783,6 +12991,7 @@ NPC 出兵后不再立刻结算:先给被袭击账号发预警(预警提前
12783
12991
  | `STAR_TOWER_CLEARED` | (v55,AISLG-146)将星塔:已全部通关(bestFloor 等于总层数),没有可挑战的层。 | 不用再挑战;想看战报用 GET_STAR_TOWER_REPORTS。 |
12784
12992
  | `STAR_TOWER_NO_CITY` | (v55,AISLG-146)将星塔:账号还没有城,首通金币无处入账,不能挑战。 | 先建城,再挑战。 |
12785
12993
  | `STAR_TOWER_NO_LINEUP` | (v55,AISLG-146)将星塔:阵容里一名武将都没有(阵容与竞技场共用)。 | 先 SET_ARENA_LINEUP 保存至少 1 名武将的阵容,再挑战。 |
12994
+ | `MAINTENANCE` | (v65,AISLG-134)服务端正在换季(维护态),游戏类协议暂不可用。登录、LOGOUT 与 GET_SEASON 仍可用。响应 data.retryAfterSec 为建议的等待秒数。 | 停止发送游戏类请求,按 retryAfterSec 等待后再试;收到 PUSH_SEASON 的 started 后服务端会断开连接,需要重新 LOGIN。 |
12786
12995
  | `ANNOUNCEMENT_NOT_FOUND` | (v60,AISLG-162)公告不存在、已撤回、尚未到生效时间,或定向到其他站点。 | 不要重试同一个 id;重新用 GET_ANNOUNCEMENTS 拉取列表确认当前可见的公告。 |
12787
12996
  | `AGENT_PASSWORD_FORBIDDEN` | (v47)Agent 用账号密码登录被拒:密码登录只属于玩家本人,Agent 一律用账号的永久 Agent 令牌登录(哪个站都一样)。 | 改用 LOGIN {token, asAgent: true}(token 为玩家提示词里的 sk_ 令牌);令牌失效(SESSION_INVALID / close code 4003)时请玩家重新发一次新提示词。 |
12788
12997
  | `PASSWORD_LOGIN_CLOSED` | (v47)该站点不开放账号密码登录:游戏有两个站(同一套服务与数据库、账号通用),国际站 slg.yuntianyou.cc 只有 Google / GitHub 登录,国内站才有账号密码。 | 网页端改用 Google / GitHub 登录;老密码账号先在国内站登录并绑定 Google / GitHub,再来本站用绑定方式登录进同一个号。Agent 不涉及(Agent 只用令牌)。 |
@@ -14157,7 +14366,7 @@ LOGOUT 吊销本连接登录所用的令牌,服务端随即关闭连接(clos
14157
14366
  - 只加不改:已发布的协议号、字段与错误码只新增、不删除、不改变类型与语义。
14158
14367
  - 新增字段不视为破坏兼容:消费方应容忍请求与响应中出现文档未列出的字段。
14159
14368
  - 必须破坏语义时启用新的协议号承载新行为,旧协议号保留原语义直至正式公告下线。
14160
- - 协议版本随对外协议内容的每次变化递增;当前为 64。
14369
+ - 协议版本随对外协议内容的每次变化递增;当前为 65。
14161
14370
  - Agent 可在启动时请求 `GET /agent-api.json`,比对 `version` 字段确认所用文档与所连服务一致;更省事的做法是每次 LOGIN 带 `docVersion`,看响应的 `protocolVersion` / `docNotice`(v32)。
14162
14371
  - 增量变更:`GET /agent-api/changes/{since}`(也接受 `?since=`)返回 `{ version, since, changes: [{ version, summary }] }`,列出 since 之后每个版本的一句话摘要;since 非法返回 HTTP 400。
14163
14372
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "slg-mcp",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "《SLG · 让你的 AI 替你征战三国》的 MCP 服务:装进 Claude Desktop / Cursor / Claude Code,AI 就能直接查城池、建造、征兵、出征、看战报。",
5
5
  "license": "MIT",
6
6
  "type": "module",