Skip to content

Commit 1b80b2c

Browse files
Adding the long and double (#378)
1 parent 0d045de commit 1b80b2c

File tree

3 files changed

+170
-2
lines changed

3 files changed

+170
-2
lines changed

src/utils/toolProperties.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ export class ToolPropertyBuilder implements McpToolProperty {
4242
return this;
4343
}
4444

45+
/**
46+
* Set the property type to double
47+
*/
48+
double(): ToolPropertyBuilder {
49+
this.property.propertyType = 'number';
50+
return this;
51+
}
52+
53+
/**
54+
* Set the property type to long
55+
*/
56+
long(): ToolPropertyBuilder {
57+
this.property.propertyType = 'number';
58+
return this;
59+
}
60+
4561
/**
4662
* Set the property type to number
4763
*/
@@ -165,6 +181,20 @@ export const arg = {
165181
return new ToolPropertyBuilder().number();
166182
},
167183

184+
/**
185+
* Start building a long property
186+
*/
187+
long(): ToolPropertyBuilder {
188+
return new ToolPropertyBuilder().long();
189+
},
190+
191+
/**
192+
* Start building a double property
193+
*/
194+
double(): ToolPropertyBuilder {
195+
return new ToolPropertyBuilder().double();
196+
},
197+
168198
/**
169199
* Start building a boolean property
170200
*/

test/converters/toMcpToolTriggerOptionsToRpc.test.ts

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,8 @@ describe('converToMcpToolTriggerOptionsToRpc', () => {
121121
booleanProp: arg.boolean().describe('A boolean property'),
122122
objectProp: arg.object().describe('An object property').optional(),
123123
integerProp: arg.integer().describe('An integer property'),
124+
longProp: arg.long().describe('A long property'),
125+
doubleProp: arg.double().describe('A double property').optional(),
124126
};
125127

126128
const input: McpToolTriggerOptions = {
@@ -135,13 +137,26 @@ describe('converToMcpToolTriggerOptionsToRpc', () => {
135137
expect(() => JSON.parse(result.toolProperties || '')).to.not.throw();
136138

137139
const parsedProperties = JSON.parse(result.toolProperties || '[]') as McpToolProperty[];
138-
expect(parsedProperties).to.have.length(5);
140+
expect(parsedProperties).to.have.length(7);
141+
142+
// Verify long and double properties are correctly converted
143+
const longProp = parsedProperties.find((p) => p.propertyName === 'longProp');
144+
expect(longProp?.propertyType).to.equal('number');
145+
expect(longProp?.description).to.equal('A long property');
146+
expect(longProp?.isRequired).to.equal(true);
147+
148+
const doubleProp = parsedProperties.find((p) => p.propertyName === 'doubleProp');
149+
expect(doubleProp?.propertyType).to.equal('number');
150+
expect(doubleProp?.description).to.equal('A double property');
151+
expect(doubleProp?.isRequired).to.equal(false);
139152
});
140153

141154
it('should handle array properties correctly', () => {
142155
const toolProperties: Args = {
143156
stringArray: arg.string().describe('A string array').asArray().optional(),
144157
numberArray: arg.number().describe('A number array').asArray(),
158+
longArray: arg.long().describe('A long array').asArray(),
159+
doubleArray: arg.double().describe('A double array').asArray().optional(),
145160
};
146161

147162
const input: McpToolTriggerOptions = {
@@ -156,7 +171,71 @@ describe('converToMcpToolTriggerOptionsToRpc', () => {
156171
expect(() => JSON.parse(result.toolProperties || '')).to.not.throw();
157172

158173
const parsedProperties = JSON.parse(result.toolProperties || '[]') as McpToolProperty[];
159-
expect(parsedProperties).to.have.length(2);
174+
expect(parsedProperties).to.have.length(4);
175+
176+
// Verify long and double array properties
177+
const longArray = parsedProperties.find((p) => p.propertyName === 'longArray');
178+
expect(longArray?.propertyType).to.equal('number');
179+
expect(longArray?.isArray).to.equal(true);
180+
expect(longArray?.isRequired).to.equal(true);
181+
182+
const doubleArray = parsedProperties.find((p) => p.propertyName === 'doubleArray');
183+
expect(doubleArray?.propertyType).to.equal('number');
184+
expect(doubleArray?.isArray).to.equal(true);
185+
expect(doubleArray?.isRequired).to.equal(false);
186+
});
187+
188+
it('should handle long and double property types specifically', () => {
189+
const toolProperties: Args = {
190+
longValue: arg.long().describe('A long integer value'),
191+
doubleValue: arg.double().describe('A double precision value').optional(),
192+
longArrayValue: arg.long().asArray().describe('Array of long values'),
193+
doubleArrayValue: arg.double().asArray().describe('Array of double values').optional(),
194+
};
195+
196+
const input: McpToolTriggerOptions = {
197+
toolName: 'long-double-tool',
198+
description: 'A tool testing long and double types',
199+
toolProperties: toolProperties,
200+
};
201+
202+
const result = converToMcpToolTriggerOptionsToRpc(input);
203+
204+
expect(result.toolProperties).to.be.a('string');
205+
expect(() => JSON.parse(result.toolProperties || '')).to.not.throw();
206+
207+
const parsedProperties = JSON.parse(result.toolProperties || '[]') as McpToolProperty[];
208+
expect(parsedProperties).to.have.length(4);
209+
210+
// Test individual long property
211+
const longProp = parsedProperties.find((p) => p.propertyName === 'longValue');
212+
expect(longProp).to.not.be.undefined;
213+
expect(longProp?.propertyType).to.equal('number');
214+
expect(longProp?.description).to.equal('A long integer value');
215+
expect(longProp?.isRequired).to.equal(true);
216+
expect(longProp?.isArray).to.equal(false);
217+
218+
// Test individual double property
219+
const doubleProp = parsedProperties.find((p) => p.propertyName === 'doubleValue');
220+
expect(doubleProp).to.not.be.undefined;
221+
expect(doubleProp?.propertyType).to.equal('number');
222+
expect(doubleProp?.description).to.equal('A double precision value');
223+
expect(doubleProp?.isRequired).to.equal(false);
224+
expect(doubleProp?.isArray).to.equal(false);
225+
226+
// Test long array property
227+
const longArrayProp = parsedProperties.find((p) => p.propertyName === 'longArrayValue');
228+
expect(longArrayProp).to.not.be.undefined;
229+
expect(longArrayProp?.propertyType).to.equal('number');
230+
expect(longArrayProp?.isArray).to.equal(true);
231+
expect(longArrayProp?.isRequired).to.equal(true);
232+
233+
// Test double array property
234+
const doubleArrayProp = parsedProperties.find((p) => p.propertyName === 'doubleArrayValue');
235+
expect(doubleArrayProp).to.not.be.undefined;
236+
expect(doubleArrayProp?.propertyType).to.equal('number');
237+
expect(doubleArrayProp?.isArray).to.equal(true);
238+
expect(doubleArrayProp?.isRequired).to.equal(false);
160239
});
161240
});
162241

test/toolArrayProperties.test.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,16 @@ describe('isArray property support', () => {
7979
const booleanArray = arg.boolean().asArray().describe('Boolean array');
8080
const objectArray = arg.object().asArray().describe('Object array');
8181
const integerArray = arg.integer().asArray().describe('Integer array');
82+
const longArray = arg.long().asArray().describe('Long array');
83+
const doubleArray = arg.double().asArray().describe('Double array');
8284

8385
expect(stringArray.isArray).to.equal(true);
8486
expect(numberArray.isArray).to.equal(true);
8587
expect(booleanArray.isArray).to.equal(true);
8688
expect(objectArray.isArray).to.equal(true);
8789
expect(integerArray.isArray).to.equal(true);
90+
expect(longArray.isArray).to.equal(true);
91+
expect(doubleArray.isArray).to.equal(true);
8892
});
8993

9094
it('supports seamless property access after desc()', () => {
@@ -115,4 +119,59 @@ describe('isArray property support', () => {
115119
const builder = arg.string();
116120
expect(builder.description).to.equal(''); // Should default to empty string
117121
});
122+
123+
it('long and double property types work correctly', () => {
124+
const longProp = arg.long().describe('A long number property');
125+
const doubleProp = arg.double().describe('A double precision property').optional();
126+
127+
// Test long property
128+
expect(longProp.propertyType).to.equal('number');
129+
expect(longProp.description).to.equal('A long number property');
130+
expect(longProp.isRequired).to.equal(true);
131+
expect(longProp.isArray).to.equal(false);
132+
133+
// Test double property
134+
expect(doubleProp.propertyType).to.equal('number');
135+
expect(doubleProp.description).to.equal('A double precision property');
136+
expect(doubleProp.isRequired).to.equal(false);
137+
expect(doubleProp.isArray).to.equal(false);
138+
});
139+
140+
it('long and double properties work with convertToolProperties', () => {
141+
const toolProps = {
142+
longValue: arg.long().describe('Long integer value'),
143+
doubleValue: arg.double().describe('Double precision value').optional(),
144+
longArray: arg.long().asArray().describe('Array of long values'),
145+
doubleArray: arg.double().asArray().describe('Array of double values').optional(),
146+
};
147+
148+
const converted = convertToolProperties(toolProps);
149+
150+
expect(converted).to.have.lengthOf(4);
151+
152+
// Test long property
153+
const longProp = converted.find((p) => p.propertyName === 'longValue');
154+
expect(longProp?.propertyType).to.equal('number');
155+
expect(longProp?.description).to.equal('Long integer value');
156+
expect(longProp?.isRequired).to.equal(true);
157+
expect(longProp?.isArray).to.equal(false);
158+
159+
// Test double property
160+
const doubleProp = converted.find((p) => p.propertyName === 'doubleValue');
161+
expect(doubleProp?.propertyType).to.equal('number');
162+
expect(doubleProp?.description).to.equal('Double precision value');
163+
expect(doubleProp?.isRequired).to.equal(false);
164+
expect(doubleProp?.isArray).to.equal(false);
165+
166+
// Test long array
167+
const longArrayProp = converted.find((p) => p.propertyName === 'longArray');
168+
expect(longArrayProp?.propertyType).to.equal('number');
169+
expect(longArrayProp?.isArray).to.equal(true);
170+
171+
// Test double array
172+
const doubleArrayProp = converted.find((p) => p.propertyName === 'doubleArray');
173+
expect(doubleArrayProp?.propertyType).to.equal('number');
174+
expect(doubleArrayProp?.isArray).to.equal(true);
175+
expect(doubleArrayProp?.isRequired).to.equal(false);
176+
});
118177
});

0 commit comments

Comments
 (0)