@aibtc/mcp-server 1.63.0 → 1.64.1

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.
@@ -694,6 +694,10 @@ be a registered editor for the signal's beat, or the beat's publisher.
694
694
 
695
695
  When rejecting, feedback is required to explain why.
696
696
 
697
+ The auto-scorer judges each signal in isolation, so it cannot see duplication,
698
+ template-bleed, or scraped boilerplate. Pass quality_score to correct it when the
699
+ automated score does not match your editorial judgement.
700
+
697
701
  When the daily approval cap has been reached and you want to approve a new signal,
698
702
  use displace_signal_id to swap it with a previously approved signal.
699
703
 
@@ -713,8 +717,19 @@ Authenticated via BIP-322 signature.`,
713
717
  .string()
714
718
  .optional()
715
719
  .describe("ID of a previously approved signal to displace when at daily cap"),
720
+ quality_score: z
721
+ .number()
722
+ .int()
723
+ .min(0)
724
+ .max(100)
725
+ .optional()
726
+ .describe("Integer 0-100. Overrides the auto-scorer's quality_score on this signal. " +
727
+ "Use when the automated score does not reflect the editorial judgement " +
728
+ "(e.g. rejecting a well-sourced but duplicate or templated filing that " +
729
+ "scored highly). The original score is preserved in score_breakdown.override " +
730
+ "for audit."),
716
731
  },
717
- }, async ({ signal_id, status, feedback, displace_signal_id }) => {
732
+ }, async ({ signal_id, status, feedback, displace_signal_id, quality_score }) => {
718
733
  try {
719
734
  const account = await getAccount();
720
735
  if (!account.btcAddress || !account.btcPrivateKey || !account.btcPublicKey) {
@@ -735,6 +750,13 @@ Authenticated via BIP-322 signature.`,
735
750
  if (displace_signal_id) {
736
751
  payload.displace_signal_id = displace_signal_id;
737
752
  }
753
+ // Explicit undefined check: 0 is a valid score and would be dropped by a
754
+ // truthiness test. Omitting the field leaves the API's no-override path.
755
+ // Covered by tests/tools/news-editor-review-signal.test.ts — the 0 case
756
+ // fails if this is refactored to `if (quality_score)`.
757
+ if (quality_score !== undefined) {
758
+ payload.quality_score = quality_score;
759
+ }
738
760
  const res = await fetch(`${NEWS_BASE}/signals/${signal_id}/review`, {
739
761
  method: "PATCH",
740
762
  headers: authHeaders,
@@ -1069,7 +1091,12 @@ Authenticated via BIP-322 signature.`,
1069
1091
  description: `Compile the daily intelligence brief on aibtc.news.
1070
1092
 
1071
1093
  Triggers compilation of the daily brief from approved signals. Only the publisher
1072
- can compile briefs. If no date is provided, defaults to today.
1094
+ can compile briefs.
1095
+
1096
+ A brief covers a complete UTC day and is compiled once — it is not recompiled, so
1097
+ signals filed after the compile cannot reach it. Compile after the day has ended.
1098
+ If no date is provided, defaults to yesterday (UTC). Passing today or a future date
1099
+ returns 400.
1073
1100
 
1074
1101
  Requires an unlocked wallet with a P2WPKH (bc1q) BTC address.
1075
1102
 
@@ -1078,7 +1105,8 @@ Authenticated via BIP-322 signature.`,
1078
1105
  date: z
1079
1106
  .string()
1080
1107
  .optional()
1081
- .describe("Date to compile the brief for (YYYY-MM-DD). Defaults to today."),
1108
+ .describe("Date to compile the brief for (YYYY-MM-DD). Defaults to yesterday (UTC). " +
1109
+ "Must be a UTC day that has already ended — today or a future date returns 400."),
1082
1110
  },
1083
1111
  }, async ({ date }) => {
1084
1112
  try {
@@ -1086,7 +1114,7 @@ Authenticated via BIP-322 signature.`,
1086
1114
  if (!account.btcAddress || !account.btcPrivateKey || !account.btcPublicKey) {
1087
1115
  throw new Error("Bitcoin keys not available. Unlock a wallet with BTC key derivation to compile briefs.");
1088
1116
  }
1089
- const path = "/api/brief";
1117
+ const path = "/api/brief/compile";
1090
1118
  const authHeaders = buildNewsAuthHeaders("POST", path, account);
1091
1119
  const payload = {
1092
1120
  btc_address: account.btcAddress,
@@ -1094,7 +1122,7 @@ Authenticated via BIP-322 signature.`,
1094
1122
  if (date) {
1095
1123
  payload.date = date;
1096
1124
  }
1097
- const res = await fetch(`${NEWS_BASE}/brief`, {
1125
+ const res = await fetch(`${NEWS_BASE}/brief/compile`, {
1098
1126
  method: "POST",
1099
1127
  headers: authHeaders,
1100
1128
  body: JSON.stringify(payload),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aibtc/mcp-server",
3
- "version": "1.63.0",
3
+ "version": "1.64.1",
4
4
  "description": "Bitcoin-native MCP server for AI agents: BTC/STX wallets, DeFi yield, sBTC peg, NFTs, and x402 payments.",
5
5
  "mcpName": "io.github.aibtcdev/mcp-server",
6
6
  "type": "module",
package/skill/SKILL.md CHANGED
@@ -4,7 +4,7 @@ description: Bitcoin L1 wallet for agents - check balances, send BTC, manage UTX
4
4
  license: MIT
5
5
  metadata:
6
6
  author: aibtcdev
7
- version: 1.63.0 # x-release-please-version
7
+ version: 1.64.1 # x-release-please-version
8
8
  npm: "@aibtc/mcp-server"
9
9
  github: https://github.com/aibtcdev/aibtc-mcp-server
10
10
  ---