rfhub-mcp 0.18.0 → 0.20.0

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.
package/dist/index.js CHANGED
@@ -2,10 +2,12 @@
2
2
  import packageJson from "../package.json" with { type: "json" };
3
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
4
4
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
- import ArfcnCalculator4G from "./tools/arfcn-calculator-4g.js";
6
- import ArfcnCalculator5G from "./tools/arfcn-calculator-5g.js";
7
- import ArfcnCalculatorNTN from "./tools/arfcn-calculator-ntn.js";
5
+ import { mcpExResponse } from "./utils/response.js";
6
+ import * as ArfcnCalculator4GCompute from "./tools/arfcn-calculator-4g-compute.js";
7
+ import * as ArfcnCalculator5GCompute from "./tools/arfcn-calculator-5g-compute.js";
8
+ import * as ArfcnCalculatorNTNCompute from "./tools/arfcn-calculator-ntn-compute.js";
8
9
  import { safeApiPost } from "./utils/request.js";
10
+ const customTools = [ArfcnCalculator4GCompute, ArfcnCalculator5GCompute, ArfcnCalculatorNTNCompute];
9
11
  const mcpServer = new McpServer({
10
12
  name: packageJson.name,
11
13
  version: packageJson.version,
@@ -13,9 +15,29 @@ const mcpServer = new McpServer({
13
15
  description: packageJson.description,
14
16
  websiteUrl: packageJson.websiteUrl,
15
17
  });
16
- ArfcnCalculator4G.registerComputeTool(mcpServer, safeApiPost);
17
- ArfcnCalculator5G.registerComputeTool(mcpServer, safeApiPost);
18
- ArfcnCalculatorNTN.registerComputeTool(mcpServer, safeApiPost);
18
+ customTools.forEach((customTool) => {
19
+ mcpServer.registerTool(customTool.name, {
20
+ title: customTool.title,
21
+ description: customTool.description,
22
+ inputSchema: customTool.inputSchema,
23
+ outputSchema: customTool.outputSchema,
24
+ }, async (input) => {
25
+ try {
26
+ const result = await customTool.execute(input, safeApiPost);
27
+ return {
28
+ content: [
29
+ {
30
+ type: "text",
31
+ text: JSON.stringify(result, null, 2),
32
+ },
33
+ ],
34
+ };
35
+ }
36
+ catch {
37
+ return mcpExResponse;
38
+ }
39
+ });
40
+ });
19
41
  async function main() {
20
42
  const transport = new StdioServerTransport();
21
43
  await mcpServer.connect(transport);
package/dist/lib.js CHANGED
@@ -1,6 +1,4 @@
1
1
  // src/lib.ts
2
- import ArfcnCalculator4G from "./tools/arfcn-calculator-4g.js";
3
- import ArfcnCalculator5G from "./tools/arfcn-calculator-5g.js";
4
- import ArfcnCalculatorNTN from "./tools/arfcn-calculator-ntn.js";
5
- // 导出它们,使它们在包外部可用
6
- export { ArfcnCalculator4G, ArfcnCalculator5G, ArfcnCalculatorNTN };
2
+ export * as ArfcnCalculator4GCompute from "./tools/arfcn-calculator-4g-compute.js";
3
+ export * as ArfcnCalculator5GCompute from "./tools/arfcn-calculator-5g-compute.js";
4
+ export * as ArfcnCalculatorNTNCompute from "./tools/arfcn-calculator-ntn-compute.js";
@@ -0,0 +1,111 @@
1
+ import * as z from "zod/v4";
2
+ import { executeGetResult } from "../utils/executeGetResult.js";
3
+ export const name = "arfcn_calculator_4g_compute";
4
+ export const title = "4G/LTE频点频率转换与对应频带信息";
5
+ export const description = "支持4G LTE网络中频率与频点之间的相互转换,并附带特定频段的详细信息展示";
6
+ export const ModeEnum = z.enum(["n", "f"]);
7
+ export const DirectionEnum = z.enum(["uplink", "downlink"]);
8
+ export const DuplexModeEnum = z.enum(["TDD", "FDD"]);
9
+ export const inputSchema = z.object({
10
+ Mode: ModeEnum.optional().describe("计算模式,例如 n 表示频点模式,f 表示频率模式"),
11
+ DataTransmissionDirection: DirectionEnum.describe("数据传输方向,可选上行(uplink)、下行(downlink)"),
12
+ NREF: z.number().int().optional().describe('频点参考(NREF),例如 504999。用于在频点模式(Mode=`"n"`)下确定中心频率。'),
13
+ FREF: z.number().optional().describe('频率参考(FREF),单位为 MHz,例如 3500.0。用于在频率模式(Mode=`"f"`)下直接指定中心频率。'),
14
+ Band: z.string().optional().describe('频段标识符,例如 "b3"、"b41" 等'),
15
+ Bandwidth: z.number().positive().optional().describe("信道带宽,单位为 MHz,例如 100 表示 100MHz"),
16
+ });
17
+ export const outputSchema = z.object({
18
+ Mode: ModeEnum.nullable().optional(),
19
+ Mode_Error: z.string().nullable().optional(),
20
+ DataTransmissionDirection: DirectionEnum.nullable().optional(),
21
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
22
+ NREF: z.number().int().nullable().optional(),
23
+ NREF_Error: z.string().nullable().optional(),
24
+ FREF: z.number().nullable().optional(),
25
+ FREF_Error: z.string().nullable().optional(),
26
+ BandOptions: z.array(z.string()).nullable().optional(),
27
+ BandOptions_Error: z.string().nullable().optional(),
28
+ Band: z.string().nullable().optional(),
29
+ Band_Error: z.string().nullable().optional(),
30
+ FREF_Low: z.number().nullable().optional(),
31
+ FREF_High: z.number().nullable().optional(),
32
+ NREF_First: z.number().int().nullable().optional(),
33
+ NREF_Last: z.number().int().nullable().optional(),
34
+ DuplexMode: DuplexModeEnum.nullable().optional(),
35
+ SCS: z.string().nullable().optional(),
36
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
37
+ BandwidthOptions_Error: z.string().nullable().optional(),
38
+ Bandwidth: z.number().nullable().optional(),
39
+ Bandwidth_Error: z.string().nullable().optional(),
40
+ NRB: z.number().int().nullable().optional(),
41
+ FREF_AvailableLow: z.number().nullable().optional(),
42
+ FREF_AvailableHigh: z.number().nullable().optional(),
43
+ });
44
+ export const apiResultSchema = z.object({
45
+ Mode: z.string().nullable().optional(),
46
+ Mode_Error: z.string().nullable().optional(),
47
+ DataTransmissionDirection: z.string().nullable().optional(),
48
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
49
+ NREF: z.string().nullable().optional(),
50
+ NREF_Error: z.string().nullable().optional(),
51
+ FREF: z.string().nullable().optional(),
52
+ FREF_Error: z.string().nullable().optional(),
53
+ BandOptions: z.array(z.string()).nullable().optional(),
54
+ BandOptions_Error: z.string().nullable().optional(),
55
+ Band: z.string().nullable().optional(),
56
+ Band_Error: z.string().nullable().optional(),
57
+ FREF_Low: z.string().nullable().optional(),
58
+ FREF_High: z.string().nullable().optional(),
59
+ NREF_First: z.string().nullable().optional(),
60
+ NREF_Last: z.string().nullable().optional(),
61
+ DuplexMode: DuplexModeEnum.nullable().optional(),
62
+ SCS: z.string().nullable().optional(),
63
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
64
+ BandwidthOptions_Error: z.string().nullable().optional(),
65
+ Bandwidth: z.string().nullable().optional(),
66
+ Bandwidth_Error: z.string().nullable().optional(),
67
+ NRB: z.string().nullable().optional(),
68
+ FREF_AvailableLow: z.string().nullable().optional(),
69
+ FREF_AvailableHigh: z.string().nullable().optional(),
70
+ });
71
+ export const execute = async (input, getResult) => {
72
+ const apiRequest = {
73
+ Mode: input.Mode ?? (input.NREF && "n"),
74
+ DataTransmissionDirection: input.DataTransmissionDirection,
75
+ Band: input.Band?.replaceAll("b", "").replaceAll("B", "") ?? null,
76
+ NERF: input.NREF?.toString() ?? null,
77
+ FERF: input.FREF?.toString() ?? null,
78
+ Bandwidth: input.Bandwidth?.toString() ?? null,
79
+ };
80
+ const result = await executeGetResult(getResult, "/api/arfcn-calculator-4g/compute", apiRequest);
81
+ const apiResult = apiResultSchema.parse(result);
82
+ // 构建结果对象
83
+ const structuredContent = {
84
+ Mode: apiResult.Mode ?? null,
85
+ Mode_Error: apiResult.Mode_Error ?? null,
86
+ DataTransmissionDirection: apiResult.DataTransmissionDirection ?? null,
87
+ DataTransmissionDirection_Error: apiResult.DataTransmissionDirection_Error ?? null,
88
+ NREF: apiResult.NREF ?? null,
89
+ NREF_Error: apiResult.NREF_Error ?? null,
90
+ FREF: apiResult.FREF ?? null,
91
+ FREF_Error: apiResult.FREF_Error ?? null,
92
+ BandOptions: apiResult.BandOptions ?? null,
93
+ BandOptions_Error: apiResult.BandOptions_Error ?? null,
94
+ Band: apiResult.Band ?? null,
95
+ Band_Error: apiResult.Band_Error ?? null,
96
+ FREF_Low: apiResult.FREF_Low ?? null,
97
+ FREF_High: apiResult.FREF_High ?? null,
98
+ NREF_First: apiResult.NREF_First ?? null,
99
+ NREF_Last: apiResult.NREF_Last ?? null,
100
+ DuplexMode: apiResult.DuplexMode ?? null,
101
+ SCS: apiResult.SCS ?? null,
102
+ BandwidthOptions: apiResult.BandwidthOptions ?? null,
103
+ BandwidthOptions_Error: apiResult.BandwidthOptions_Error ?? null,
104
+ Bandwidth: apiResult.Bandwidth ?? null,
105
+ Bandwidth_Error: apiResult.Bandwidth_Error ?? null,
106
+ NRB: apiResult.NRB ?? null,
107
+ FREF_AvailableLow: apiResult.FREF_AvailableLow ?? null,
108
+ FREF_AvailableHigh: apiResult.FREF_AvailableHigh ?? null,
109
+ };
110
+ return structuredContent;
111
+ };
@@ -0,0 +1,179 @@
1
+ import * as z from "zod/v4";
2
+ import { executeGetResult } from "../utils/executeGetResult.js";
3
+ export const name = "arfcn_calculator_5g_compute";
4
+ export const title = "5G/NR频点频率转换与对应频带信息";
5
+ export const description = "支持5G NR网络中频率与频点之间的相互转换,并附带特定频段的详细信息展示";
6
+ export const ModeEnum = z.enum(["n", "f"]);
7
+ export const DirectionEnum = z.enum(["uplink", "downlink"]);
8
+ export const DuplexModeEnum = z.enum(["TDD", "FDD"]);
9
+ export const inputSchema = z.object({
10
+ Mode: ModeEnum.nullable().optional().describe("计算模式,例如 n 表示频点模式,f 表示频率模式"),
11
+ DataTransmissionDirection: DirectionEnum.describe("数据传输方向,可选上行(uplink)、下行(downlink)"),
12
+ NREF: z.number().int().nullable().optional().describe('频点参考值(NREF),例如 `"504999"`。用于在频点模式(Mode=`"n"`)下确定中心频率。'),
13
+ FREF: z.number().nullable().optional().describe('频率参考值(FREF),例如 `"3500.0"`。用于在频率模式(Mode=`"f"`)下直接指定中心频率。'),
14
+ Band: z.string().nullable().optional().describe('频段标识符,例如 `"n78"`、`"n41"` 等。用于确定频段的上下行配置、信道栅格(raster)及边界频率。'),
15
+ FRaster: z.number().int().nullable().optional().describe("频率栅格(Frequency Raster),单位为 kHz,例如 5、15。用于频点与频率之间的转换计算。"),
16
+ SCS: z.number().int().nullable().optional().describe("子载波间隔(Subcarrier Spacing),单位为 kHz,例如 15、30。影响资源块结构和带宽计算。"),
17
+ Bandwidth: z
18
+ .number()
19
+ .nullable()
20
+ .optional()
21
+ .describe("信道带宽(Channel Bandwidth),单位为 MHz,例如 5、20、100。用于确定传输带宽配置(Transmission Bandwidth Configuration)。"),
22
+ SSBlockSCS: z.number().int().nullable().optional().describe("SSB(Synchronization Signal Block)的子载波间隔,单位为 kHz,例如 15、30。"),
23
+ SSBlockPattern: z
24
+ .string()
25
+ .nullable()
26
+ .optional()
27
+ .describe('SSB 波束扫描图案类型,例如 `"Case A"`、`"Case B"`、`"Case C"`(FR1)或 `"Case D"`、`"Case E"`(FR2),影响 SSB 时域位置和数量。'),
28
+ GSCN: z
29
+ .number()
30
+ .int()
31
+ .nullable()
32
+ .optional()
33
+ .describe("全局同步信道号(Global Synchronization Channel Number),用于粗粒度频率搜索,特别是在非服务小区初始接入时。例如 504990"),
34
+ SSREF: z.number().nullable().optional().describe("SSB 中心频率对应的参考频率(单位:Hz 或 MHz,依上下文而定),常用于从 GSCN 或 SSB 配置反推绝对频率。"),
35
+ N: z.number().int().nullable().optional().describe("用于 SSB 频域位置计算的参数 N,通常与 GSCN 或 raster 相关。例如 6312"),
36
+ M: z.number().int().nullable().optional().describe("SSB 频域偏移步长因子,取决于频段和 SSB 子载波间隔。例如 1、3、5"),
37
+ });
38
+ export const outputSchema = z.object({
39
+ Mode: ModeEnum.nullable().optional(),
40
+ Mode_Error: z.string().nullable().optional(),
41
+ DataTransmissionDirection: DirectionEnum.nullable().optional(),
42
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
43
+ NREF: z.number().int().nullable().optional(),
44
+ NREF_Error: z.string().nullable().optional(),
45
+ FREF: z.number().nullable().optional(),
46
+ FREF_Error: z.string().nullable().optional(),
47
+ FGlobalRaster: z.number().nullable().optional(), // 全局频率栅格,kHz(数值)
48
+ FrequencyRangeDesignation: z.string().nullable().optional(), // 频率范围标识符
49
+ BandOptions: z.array(z.string()).nullable().optional(),
50
+ BandOptions_Error: z.string().nullable().optional(),
51
+ Band: z.string().nullable().optional(),
52
+ Band_Error: z.string().nullable().optional(),
53
+ FREF_Low: z.number().nullable().optional(),
54
+ FREF_High: z.number().nullable().optional(),
55
+ FRasterOptions_Error: z.string().nullable().optional(),
56
+ FRasterOptions: z.array(z.string()).nullable().optional(),
57
+ FRaster: z.number().nullable().optional(),
58
+ FRaster_Error: z.string().nullable().optional(),
59
+ NREF_StepSize: z.number().int().nullable().optional(),
60
+ NREF_First: z.number().int().nullable().optional(),
61
+ NREF_Last: z.number().int().nullable().optional(),
62
+ DuplexMode: DuplexModeEnum.nullable().optional(),
63
+ SCSOptions: z.array(z.string()).nullable().optional(),
64
+ SCSOptions_Error: z.string().nullable().optional(),
65
+ SCS: z.string().nullable().optional(),
66
+ SCS_Error: z.string().nullable().optional(),
67
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
68
+ BandwidthOptions_Error: z.string().nullable().optional(),
69
+ Bandwidth: z.number().nullable().optional(), // 带宽单位可能是 MHz,但以数字形式
70
+ Bandwidth_Error: z.string().nullable().optional(),
71
+ NRB: z.number().int().nullable().optional(), // 资源块数量,整数
72
+ MinimumGuardband: z.number().nullable().optional(), // 最小保护带宽,kHz(数值)
73
+ FREF_AvailableLow: z.number().nullable().optional(),
74
+ FREF_AvailableHigh: z.number().nullable().optional(),
75
+ SSBlockSCSOptions: z.array(z.number()).nullable().optional(),
76
+ SSBlockSCSOptions_Error: z.string().nullable().optional(),
77
+ SSBlockSCS: z.number().nullable().optional(),
78
+ SSBlockSCS_Error: z.string().nullable().optional(),
79
+ SSBlockPatternOptions: z.array(z.string()).nullable().optional(),
80
+ SSBlockPatternOptions_Error: z.string().nullable().optional(),
81
+ SSBlockPattern: z.string().nullable().optional(),
82
+ SSBlockPattern_Error: z.string().nullable().optional(),
83
+ NRaster: z.number().nullable().optional(),
84
+ GSCN_First: z.number().int().nullable().optional(),
85
+ GSCN_Last: z.number().int().nullable().optional(),
86
+ GSCN_StepSize: z.number().int().nullable().optional(),
87
+ GSCN: z.number().int().nullable().optional(),
88
+ GSCN_Error: z.string().nullable().optional(),
89
+ SSREF: z.number().nullable().optional(),
90
+ SSREF_Error: z.string().nullable().optional(),
91
+ SSBlockNREF: z.number().int().nullable().optional(),
92
+ N: z.number().int().nullable().optional(),
93
+ N_Error: z.string().nullable().optional(),
94
+ MOptions: z.array(z.number()).nullable().optional(),
95
+ MOptions_Error: z.string().nullable().optional(),
96
+ M: z.number().int().nullable().optional(),
97
+ M_Error: z.string().nullable().optional(),
98
+ });
99
+ export const apiResultSchema = z.object({
100
+ Mode: ModeEnum.nullable().optional(),
101
+ Mode_Error: z.string().nullable().optional(),
102
+ DataTransmissionDirection: DirectionEnum.nullable().optional(),
103
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
104
+ NREF: z.string().nullable().optional(),
105
+ NREF_Error: z.string().nullable().optional(),
106
+ FREF: z.string().nullable().optional(),
107
+ FREF_Error: z.string().nullable().optional(),
108
+ FGlobalRaster: z.string().nullable().optional(), // 全局频率栅格,kHz
109
+ FrequencyRangeDesignation: z.string().nullable().optional(), // 频率范围标识符
110
+ BandOptions: z.array(z.string()).nullable().optional(),
111
+ BandOptions_Error: z.string().nullable().optional(),
112
+ Band: z.string().nullable().optional(),
113
+ Band_Error: z.string().nullable().optional(),
114
+ FREF_Low: z.string().nullable().optional(),
115
+ FREF_High: z.string().nullable().optional(),
116
+ FRasterOptions_Error: z.string().nullable().optional(),
117
+ FRasterOptions: z.array(z.string()).nullable().optional(),
118
+ FRaster: z.string().nullable().optional(),
119
+ FRaster_Error: z.string().nullable().optional(),
120
+ NREF_StepSize: z.string().nullable().optional(),
121
+ NREF_First: z.string().nullable().optional(),
122
+ NREF_Last: z.string().nullable().optional(),
123
+ DuplexMode: DuplexModeEnum.nullable().optional(),
124
+ SCSOptions: z.array(z.string()).nullable().optional(),
125
+ SCSOptions_Error: z.string().nullable().optional(),
126
+ SCS: z.string().nullable().optional(),
127
+ SCS_Error: z.string().nullable().optional(),
128
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
129
+ BandwidthOptions_Error: z.string().nullable().optional(),
130
+ Bandwidth: z.string().nullable().optional(),
131
+ Bandwidth_Error: z.string().nullable().optional(),
132
+ NRB: z.string().nullable().optional(),
133
+ MinimumGuardband: z.string().nullable().optional(),
134
+ FREF_AvailableLow: z.string().nullable().optional(),
135
+ FREF_AvailableHigh: z.string().nullable().optional(),
136
+ SSBlockSCSOptions: z.array(z.string()).nullable().optional(),
137
+ SSBlockSCSOptions_Error: z.string().nullable().optional(),
138
+ SSBlockSCS: z.string().nullable().optional(),
139
+ SSBlockSCS_Error: z.string().nullable().optional(),
140
+ SSBlockPatternOptions: z.array(z.string()).nullable().optional(),
141
+ SSBlockPatternOptions_Error: z.string().nullable().optional(),
142
+ SSBlockPattern: z.string().nullable().optional(),
143
+ SSBlockPattern_Error: z.string().nullable().optional(),
144
+ NRaster: z.string().nullable().optional(),
145
+ GSCN_First: z.string().nullable().optional(),
146
+ GSCN_Last: z.string().nullable().optional(),
147
+ GSCN_StepSize: z.string().nullable().optional(),
148
+ GSCN: z.string().nullable().optional(),
149
+ GSCN_Error: z.string().nullable().optional(),
150
+ SSREF: z.string().nullable().optional(),
151
+ SSREF_Error: z.string().nullable().optional(),
152
+ SSBlockNREF: z.string().nullable().optional(),
153
+ N: z.string().nullable().optional(),
154
+ N_Error: z.string().nullable().optional(),
155
+ MOptions: z.array(z.string()).nullable().optional(),
156
+ MOptions_Error: z.string().nullable().optional(),
157
+ M: z.string().nullable().optional(),
158
+ M_Error: z.string().nullable().optional(),
159
+ });
160
+ export const execute = async (input, getResult) => {
161
+ const apiRequest = {
162
+ Mode: input.Mode ?? (input.NREF && "n"),
163
+ DataTransmissionDirection: input.DataTransmissionDirection,
164
+ Band: input.Band?.replaceAll("b", "").replaceAll("B", "") ?? null,
165
+ NERF: input.NREF?.toString() ?? null,
166
+ FERF: input.FREF?.toString() ?? null,
167
+ Bandwidth: input.Bandwidth?.toString() ?? null,
168
+ FRaster: input.FRaster?.toString() ?? null,
169
+ SCS: input.SCS?.toString() ?? null,
170
+ SSBlockSCS: input.SSBlockSCS?.toString() ?? null,
171
+ GSCN: input.GSCN?.toString() ?? null,
172
+ SSREF: input.SSREF?.toString() ?? null,
173
+ SSBlockPattern: input.SSBlockPattern?.toString() ?? null,
174
+ N: input.N?.toString() ?? null,
175
+ M: input.M?.toString() ?? null,
176
+ };
177
+ const result = await executeGetResult(getResult, "/api/arfcn-calculator-5g/compute", apiRequest);
178
+ return apiResultSchema.parse(result);
179
+ };
@@ -0,0 +1,179 @@
1
+ import * as z from "zod/v4";
2
+ import { executeGetResult } from "../utils/executeGetResult.js";
3
+ export const name = "arfcn_calculator_ntn_compute";
4
+ export const title = "5G/NTN频点频率转换与对应频带信息";
5
+ export const description = "支持5G NTN网络中频率与频点之间的相互转换,并附带特定频段的详细信息展示";
6
+ export const ModeEnum = z.enum(["n", "f"]);
7
+ export const DirectionEnum = z.enum(["uplink", "downlink"]);
8
+ export const DuplexModeEnum = z.enum(["TDD", "FDD"]);
9
+ export const inputSchema = z.object({
10
+ Mode: ModeEnum.nullable().optional().describe("计算模式,例如 n 表示频点模式,f 表示频率模式"),
11
+ DataTransmissionDirection: DirectionEnum.describe("数据传输方向,可选上行(uplink)、下行(downlink)"),
12
+ NREF: z.number().int().nullable().optional().describe('频点参考值(NREF),例如 `"504999"`。用于在频点模式(Mode=`"n"`)下确定中心频率。'),
13
+ FREF: z.number().nullable().optional().describe('频率参考值(FREF),例如 `"3500.0"`。用于在频率模式(Mode=`"f"`)下直接指定中心频率。'),
14
+ Band: z.string().nullable().optional().describe('频段标识符,例如 `"n78"`、`"n41"` 等。用于确定频段的上下行配置、信道栅格(raster)及边界频率。'),
15
+ FRaster: z.number().int().nullable().optional().describe("频率栅格(Frequency Raster),单位为 kHz,例如 5、15。用于频点与频率之间的转换计算。"),
16
+ SCS: z.number().int().nullable().optional().describe("子载波间隔(Subcarrier Spacing),单位为 kHz,例如 15、30。影响资源块结构和带宽计算。"),
17
+ Bandwidth: z
18
+ .number()
19
+ .nullable()
20
+ .optional()
21
+ .describe("信道带宽(Channel Bandwidth),单位为 MHz,例如 5、20、100。用于确定传输带宽配置(Transmission Bandwidth Configuration)。"),
22
+ SSBlockSCS: z.number().int().nullable().optional().describe("SSB(Synchronization Signal Block)的子载波间隔,单位为 kHz,例如 15、30。"),
23
+ SSBlockPattern: z
24
+ .string()
25
+ .nullable()
26
+ .optional()
27
+ .describe('SSB 波束扫描图案类型,例如 `"Case A"`、`"Case B"`、`"Case C"`(FR1)或 `"Case D"`、`"Case E"`(FR2),影响 SSB 时域位置和数量。'),
28
+ GSCN: z
29
+ .number()
30
+ .int()
31
+ .nullable()
32
+ .optional()
33
+ .describe("全局同步信道号(Global Synchronization Channel Number),用于粗粒度频率搜索,特别是在非服务小区初始接入时。例如 504990"),
34
+ SSREF: z.number().nullable().optional().describe("SSB 中心频率对应的参考频率(单位:Hz 或 MHz,依上下文而定),常用于从 GSCN 或 SSB 配置反推绝对频率。"),
35
+ N: z.number().int().nullable().optional().describe("用于 SSB 频域位置计算的参数 N,通常与 GSCN 或 raster 相关。例如 6312"),
36
+ M: z.number().int().nullable().optional().describe("SSB 频域偏移步长因子,取决于频段和 SSB 子载波间隔。例如 1、3、5"),
37
+ });
38
+ export const outputSchema = z.object({
39
+ Mode: ModeEnum.nullable().optional(),
40
+ Mode_Error: z.string().nullable().optional(),
41
+ DataTransmissionDirection: DirectionEnum.nullable().optional(),
42
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
43
+ NREF: z.number().int().nullable().optional(),
44
+ NREF_Error: z.string().nullable().optional(),
45
+ FREF: z.number().nullable().optional(),
46
+ FREF_Error: z.string().nullable().optional(),
47
+ FGlobalRaster: z.number().nullable().optional(), // 全局频率栅格,kHz(数值)
48
+ FrequencyRangeDesignation: z.string().nullable().optional(), // 频率范围标识符
49
+ BandOptions: z.array(z.string()).nullable().optional(),
50
+ BandOptions_Error: z.string().nullable().optional(),
51
+ Band: z.string().nullable().optional(),
52
+ Band_Error: z.string().nullable().optional(),
53
+ FREF_Low: z.number().nullable().optional(),
54
+ FREF_High: z.number().nullable().optional(),
55
+ FRasterOptions_Error: z.string().nullable().optional(),
56
+ FRasterOptions: z.array(z.string()).nullable().optional(),
57
+ FRaster: z.number().nullable().optional(),
58
+ FRaster_Error: z.string().nullable().optional(),
59
+ NREF_StepSize: z.number().int().nullable().optional(),
60
+ NREF_First: z.number().int().nullable().optional(),
61
+ NREF_Last: z.number().int().nullable().optional(),
62
+ DuplexMode: DuplexModeEnum.nullable().optional(),
63
+ SCSOptions: z.array(z.string()).nullable().optional(),
64
+ SCSOptions_Error: z.string().nullable().optional(),
65
+ SCS: z.string().nullable().optional(),
66
+ SCS_Error: z.string().nullable().optional(),
67
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
68
+ BandwidthOptions_Error: z.string().nullable().optional(),
69
+ Bandwidth: z.number().nullable().optional(), // 带宽单位可能是 MHz,但以数字形式
70
+ Bandwidth_Error: z.string().nullable().optional(),
71
+ NRB: z.number().int().nullable().optional(), // 资源块数量,整数
72
+ MinimumGuardband: z.number().nullable().optional(), // 最小保护带宽,kHz(数值)
73
+ FREF_AvailableLow: z.number().nullable().optional(),
74
+ FREF_AvailableHigh: z.number().nullable().optional(),
75
+ SSBlockSCSOptions: z.array(z.number()).nullable().optional(),
76
+ SSBlockSCSOptions_Error: z.string().nullable().optional(),
77
+ SSBlockSCS: z.number().nullable().optional(),
78
+ SSBlockSCS_Error: z.string().nullable().optional(),
79
+ SSBlockPatternOptions: z.array(z.string()).nullable().optional(),
80
+ SSBlockPatternOptions_Error: z.string().nullable().optional(),
81
+ SSBlockPattern: z.string().nullable().optional(),
82
+ SSBlockPattern_Error: z.string().nullable().optional(),
83
+ NRaster: z.number().nullable().optional(),
84
+ GSCN_First: z.number().int().nullable().optional(),
85
+ GSCN_Last: z.number().int().nullable().optional(),
86
+ GSCN_StepSize: z.number().int().nullable().optional(),
87
+ GSCN: z.number().int().nullable().optional(),
88
+ GSCN_Error: z.string().nullable().optional(),
89
+ SSREF: z.number().nullable().optional(),
90
+ SSREF_Error: z.string().nullable().optional(),
91
+ SSBlockNREF: z.number().int().nullable().optional(),
92
+ N: z.number().int().nullable().optional(),
93
+ N_Error: z.string().nullable().optional(),
94
+ MOptions: z.array(z.number()).nullable().optional(),
95
+ MOptions_Error: z.string().nullable().optional(),
96
+ M: z.number().int().nullable().optional(),
97
+ M_Error: z.string().nullable().optional(),
98
+ });
99
+ export const apiResultSchema = z.object({
100
+ Mode: ModeEnum.nullable().optional(),
101
+ Mode_Error: z.string().nullable().optional(),
102
+ DataTransmissionDirection: DirectionEnum.nullable().optional(),
103
+ DataTransmissionDirection_Error: z.string().nullable().optional(),
104
+ NREF: z.string().nullable().optional(),
105
+ NREF_Error: z.string().nullable().optional(),
106
+ FREF: z.string().nullable().optional(),
107
+ FREF_Error: z.string().nullable().optional(),
108
+ FGlobalRaster: z.string().nullable().optional(), // 全局频率栅格,kHz
109
+ FrequencyRangeDesignation: z.string().nullable().optional(), // 频率范围标识符
110
+ BandOptions: z.array(z.string()).nullable().optional(),
111
+ BandOptions_Error: z.string().nullable().optional(),
112
+ Band: z.string().nullable().optional(),
113
+ Band_Error: z.string().nullable().optional(),
114
+ FREF_Low: z.string().nullable().optional(),
115
+ FREF_High: z.string().nullable().optional(),
116
+ FRasterOptions_Error: z.string().nullable().optional(),
117
+ FRasterOptions: z.array(z.string()).nullable().optional(),
118
+ FRaster: z.string().nullable().optional(),
119
+ FRaster_Error: z.string().nullable().optional(),
120
+ NREF_StepSize: z.string().nullable().optional(),
121
+ NREF_First: z.string().nullable().optional(),
122
+ NREF_Last: z.string().nullable().optional(),
123
+ DuplexMode: DuplexModeEnum.nullable().optional(),
124
+ SCSOptions: z.array(z.string()).nullable().optional(),
125
+ SCSOptions_Error: z.string().nullable().optional(),
126
+ SCS: z.string().nullable().optional(),
127
+ SCS_Error: z.string().nullable().optional(),
128
+ BandwidthOptions: z.array(z.string()).nullable().optional(),
129
+ BandwidthOptions_Error: z.string().nullable().optional(),
130
+ Bandwidth: z.string().nullable().optional(),
131
+ Bandwidth_Error: z.string().nullable().optional(),
132
+ NRB: z.string().nullable().optional(),
133
+ MinimumGuardband: z.string().nullable().optional(),
134
+ FREF_AvailableLow: z.string().nullable().optional(),
135
+ FREF_AvailableHigh: z.string().nullable().optional(),
136
+ SSBlockSCSOptions: z.array(z.string()).nullable().optional(),
137
+ SSBlockSCSOptions_Error: z.string().nullable().optional(),
138
+ SSBlockSCS: z.string().nullable().optional(),
139
+ SSBlockSCS_Error: z.string().nullable().optional(),
140
+ SSBlockPatternOptions: z.array(z.string()).nullable().optional(),
141
+ SSBlockPatternOptions_Error: z.string().nullable().optional(),
142
+ SSBlockPattern: z.string().nullable().optional(),
143
+ SSBlockPattern_Error: z.string().nullable().optional(),
144
+ NRaster: z.string().nullable().optional(),
145
+ GSCN_First: z.string().nullable().optional(),
146
+ GSCN_Last: z.string().nullable().optional(),
147
+ GSCN_StepSize: z.string().nullable().optional(),
148
+ GSCN: z.string().nullable().optional(),
149
+ GSCN_Error: z.string().nullable().optional(),
150
+ SSREF: z.string().nullable().optional(),
151
+ SSREF_Error: z.string().nullable().optional(),
152
+ SSBlockNREF: z.string().nullable().optional(),
153
+ N: z.string().nullable().optional(),
154
+ N_Error: z.string().nullable().optional(),
155
+ MOptions: z.array(z.string()).nullable().optional(),
156
+ MOptions_Error: z.string().nullable().optional(),
157
+ M: z.string().nullable().optional(),
158
+ M_Error: z.string().nullable().optional(),
159
+ });
160
+ export const execute = async (input, getResult) => {
161
+ const apiRequest = {
162
+ Mode: input.Mode ?? (input.NREF && "n"),
163
+ DataTransmissionDirection: input.DataTransmissionDirection,
164
+ Band: input.Band?.replaceAll("b", "").replaceAll("B", "") ?? null,
165
+ NERF: input.NREF?.toString() ?? null,
166
+ FERF: input.FREF?.toString() ?? null,
167
+ Bandwidth: input.Bandwidth?.toString() ?? null,
168
+ FRaster: input.FRaster?.toString() ?? null,
169
+ SCS: input.SCS?.toString() ?? null,
170
+ SSBlockSCS: input.SSBlockSCS?.toString() ?? null,
171
+ GSCN: input.GSCN?.toString() ?? null,
172
+ SSREF: input.SSREF?.toString() ?? null,
173
+ SSBlockPattern: input.SSBlockPattern?.toString() ?? null,
174
+ N: input.N?.toString() ?? null,
175
+ M: input.M?.toString() ?? null,
176
+ };
177
+ const result = await executeGetResult(getResult, "/api/arfcn-calculator-ntn/compute", apiRequest);
178
+ return apiResultSchema.parse(result);
179
+ };
@@ -1,6 +1,5 @@
1
- import ArfcnCalculator4G from "./tools/arfcn-calculator-4g.js";
2
- import ArfcnCalculator5G from "./tools/arfcn-calculator-5g.js";
3
- import ArfcnCalculatorNTN from "./tools/arfcn-calculator-ntn.js";
4
- import type { SafeApiPost, InternalCompute, GetResult } from "./utils/executeGetResult.js";
5
- export { ArfcnCalculator4G, ArfcnCalculator5G, ArfcnCalculatorNTN, SafeApiPost, InternalCompute, GetResult };
1
+ export type { GetResult, SafeApiPost, InternalCompute, CustomTool } from "./types/tool.js";
2
+ export * as ArfcnCalculator4GCompute from "./tools/arfcn-calculator-4g-compute.js";
3
+ export * as ArfcnCalculator5GCompute from "./tools/arfcn-calculator-5g-compute.js";
4
+ export * as ArfcnCalculatorNTNCompute from "./tools/arfcn-calculator-ntn-compute.js";
6
5
  //# sourceMappingURL=lib.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAEA,OAAO,iBAAiB,MAAM,gCAAgC,CAAC;AAC/D,OAAO,iBAAiB,MAAM,gCAAgC,CAAC;AAC/D,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG3F,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/lib.ts"],"names":[],"mappings":"AAGA,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,KAAK,wBAAwB,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,wBAAwB,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,yBAAyB,MAAM,yCAAyC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};