mcp-rubber-duck 1.6.0 → 1.7.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/CHANGELOG.md +14 -0
- package/README.md +23 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +60 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/src/server.ts +60 -0
- package/tests/tool-annotations.test.ts +488 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
+
# [1.7.0](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.6.1...v1.7.0) (2026-01-13)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* add tool annotations for MCP spec compliance ([7d03f2d](https://github.com/nesquikm/mcp-rubber-duck/commit/7d03f2d3545bcaf455c3077bda420d0db7c0ce7a)), closes [#22](https://github.com/nesquikm/mcp-rubber-duck/issues/22)
|
|
7
|
+
|
|
8
|
+
## [1.6.1](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.6.0...v1.6.1) (2026-01-09)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **docs:** add missing get_usage_stats tool to README ([c507f07](https://github.com/nesquikm/mcp-rubber-duck/commit/c507f07092018ad48aa24f6e9115a0761d0d7d49))
|
|
14
|
+
|
|
1
15
|
# [1.6.0](https://github.com/nesquikm/mcp-rubber-duck/compare/v1.5.2...v1.6.0) (2026-01-08)
|
|
2
16
|
|
|
3
17
|
|
package/README.md
CHANGED
|
@@ -43,6 +43,7 @@ An MCP (Model Context Protocol) server that acts as a bridge to query multiple O
|
|
|
43
43
|
- 💾 **Response Caching**: Avoid duplicate API calls with intelligent caching
|
|
44
44
|
- 🔁 **Automatic Failover**: Falls back to other providers if primary fails
|
|
45
45
|
- 📊 **Health Monitoring**: Real-time health checks for all providers
|
|
46
|
+
- 💰 **Usage Tracking**: Track requests, tokens, and estimated costs per provider
|
|
46
47
|
- 🔗 **MCP Bridge**: Connect ducks to other MCP servers for extended functionality
|
|
47
48
|
- 🛡️ **Granular Security**: Per-server approval controls with session-based approvals
|
|
48
49
|
- 🎨 **Fun Duck Theme**: Rubber duck debugging with personality!
|
|
@@ -510,6 +511,19 @@ Get responses from all configured ducks - like a panel discussion!
|
|
|
510
511
|
}
|
|
511
512
|
```
|
|
512
513
|
|
|
514
|
+
#### 📊 get_usage_stats
|
|
515
|
+
Get usage statistics and estimated costs for your duck queries.
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
{
|
|
519
|
+
"period": "today" // Optional: "today", "7d", "30d", or "all"
|
|
520
|
+
}
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
Returns requests, tokens (prompt/completion), cache hits, errors, and estimated costs broken down by provider and model.
|
|
524
|
+
|
|
525
|
+
Usage data is stored in `~/.mcp-rubber-duck/data/usage.json`.
|
|
526
|
+
|
|
513
527
|
### Multi-Agent Consensus & Debate Tools
|
|
514
528
|
|
|
515
529
|
Research-backed tools for multi-agent coordination.
|
|
@@ -695,6 +709,15 @@ await duck_debate({
|
|
|
695
709
|
});
|
|
696
710
|
```
|
|
697
711
|
|
|
712
|
+
### Check Usage Stats
|
|
713
|
+
```javascript
|
|
714
|
+
// See today's usage
|
|
715
|
+
await get_usage_stats({ period: "today" });
|
|
716
|
+
|
|
717
|
+
// See last 7 days with cost breakdown
|
|
718
|
+
await get_usage_stats({ period: "7d" });
|
|
719
|
+
```
|
|
720
|
+
|
|
698
721
|
## Provider-Specific Setup
|
|
699
722
|
|
|
700
723
|
### Ollama (Local)
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA4CA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,uBAAuB,CAAC,CAA0B;IAC1D,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAkB;;IAmCpC,OAAO,CAAC,mBAAmB;IA4C3B,OAAO,CAAC,aAAa;YA8GP,oBAAoB;YAwCpB,yBAAyB;YA6BzB,wBAAwB;IAwBtC,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,QAAQ;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AA4CA,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,uBAAuB,CAAC,CAA0B;IAC1D,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,aAAa,CAAgB;IAGrC,OAAO,CAAC,gBAAgB,CAAC,CAAmB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,UAAU,CAAkB;;IAmCpC,OAAO,CAAC,mBAAmB;IA4C3B,OAAO,CAAC,aAAa;YA8GP,oBAAoB;YAwCpB,yBAAyB;YA6BzB,wBAAwB;IAwBtC,OAAO,CAAC,0BAA0B;IAyClC,OAAO,CAAC,QAAQ;IA2ZV,KAAK;IAmCL,IAAI;CAkBX"}
|
package/dist/server.js
CHANGED
|
@@ -315,6 +315,10 @@ export class RubberDuckServer {
|
|
|
315
315
|
},
|
|
316
316
|
required: ['prompt'],
|
|
317
317
|
},
|
|
318
|
+
annotations: {
|
|
319
|
+
readOnlyHint: true,
|
|
320
|
+
openWorldHint: true,
|
|
321
|
+
},
|
|
318
322
|
},
|
|
319
323
|
{
|
|
320
324
|
name: 'chat_with_duck',
|
|
@@ -341,6 +345,9 @@ export class RubberDuckServer {
|
|
|
341
345
|
},
|
|
342
346
|
required: ['conversation_id', 'message'],
|
|
343
347
|
},
|
|
348
|
+
annotations: {
|
|
349
|
+
openWorldHint: true,
|
|
350
|
+
},
|
|
344
351
|
},
|
|
345
352
|
{
|
|
346
353
|
name: 'clear_conversations',
|
|
@@ -349,6 +356,11 @@ export class RubberDuckServer {
|
|
|
349
356
|
type: 'object',
|
|
350
357
|
properties: {},
|
|
351
358
|
},
|
|
359
|
+
annotations: {
|
|
360
|
+
destructiveHint: true,
|
|
361
|
+
idempotentHint: true,
|
|
362
|
+
openWorldHint: false,
|
|
363
|
+
},
|
|
352
364
|
},
|
|
353
365
|
{
|
|
354
366
|
name: 'list_ducks',
|
|
@@ -363,6 +375,10 @@ export class RubberDuckServer {
|
|
|
363
375
|
},
|
|
364
376
|
},
|
|
365
377
|
},
|
|
378
|
+
annotations: {
|
|
379
|
+
readOnlyHint: true,
|
|
380
|
+
openWorldHint: true,
|
|
381
|
+
},
|
|
366
382
|
},
|
|
367
383
|
{
|
|
368
384
|
name: 'list_models',
|
|
@@ -381,6 +397,10 @@ export class RubberDuckServer {
|
|
|
381
397
|
},
|
|
382
398
|
},
|
|
383
399
|
},
|
|
400
|
+
annotations: {
|
|
401
|
+
readOnlyHint: true,
|
|
402
|
+
openWorldHint: true,
|
|
403
|
+
},
|
|
384
404
|
},
|
|
385
405
|
{
|
|
386
406
|
name: 'compare_ducks',
|
|
@@ -406,6 +426,10 @@ export class RubberDuckServer {
|
|
|
406
426
|
},
|
|
407
427
|
required: ['prompt'],
|
|
408
428
|
},
|
|
429
|
+
annotations: {
|
|
430
|
+
readOnlyHint: true,
|
|
431
|
+
openWorldHint: true,
|
|
432
|
+
},
|
|
409
433
|
},
|
|
410
434
|
{
|
|
411
435
|
name: 'duck_council',
|
|
@@ -424,6 +448,10 @@ export class RubberDuckServer {
|
|
|
424
448
|
},
|
|
425
449
|
required: ['prompt'],
|
|
426
450
|
},
|
|
451
|
+
annotations: {
|
|
452
|
+
readOnlyHint: true,
|
|
453
|
+
openWorldHint: true,
|
|
454
|
+
},
|
|
427
455
|
},
|
|
428
456
|
{
|
|
429
457
|
name: 'duck_vote',
|
|
@@ -455,6 +483,10 @@ export class RubberDuckServer {
|
|
|
455
483
|
},
|
|
456
484
|
required: ['question', 'options'],
|
|
457
485
|
},
|
|
486
|
+
annotations: {
|
|
487
|
+
readOnlyHint: true,
|
|
488
|
+
openWorldHint: true,
|
|
489
|
+
},
|
|
458
490
|
},
|
|
459
491
|
{
|
|
460
492
|
name: 'duck_judge',
|
|
@@ -493,6 +525,10 @@ export class RubberDuckServer {
|
|
|
493
525
|
},
|
|
494
526
|
required: ['responses'],
|
|
495
527
|
},
|
|
528
|
+
annotations: {
|
|
529
|
+
readOnlyHint: true,
|
|
530
|
+
openWorldHint: true,
|
|
531
|
+
},
|
|
496
532
|
},
|
|
497
533
|
{
|
|
498
534
|
name: 'duck_iterate',
|
|
@@ -526,6 +562,10 @@ export class RubberDuckServer {
|
|
|
526
562
|
},
|
|
527
563
|
required: ['prompt', 'providers', 'mode'],
|
|
528
564
|
},
|
|
565
|
+
annotations: {
|
|
566
|
+
readOnlyHint: true,
|
|
567
|
+
openWorldHint: true,
|
|
568
|
+
},
|
|
529
569
|
},
|
|
530
570
|
{
|
|
531
571
|
name: 'duck_debate',
|
|
@@ -562,6 +602,10 @@ export class RubberDuckServer {
|
|
|
562
602
|
},
|
|
563
603
|
required: ['prompt', 'format'],
|
|
564
604
|
},
|
|
605
|
+
annotations: {
|
|
606
|
+
readOnlyHint: true,
|
|
607
|
+
openWorldHint: true,
|
|
608
|
+
},
|
|
565
609
|
},
|
|
566
610
|
{
|
|
567
611
|
name: 'get_usage_stats',
|
|
@@ -577,6 +621,10 @@ export class RubberDuckServer {
|
|
|
577
621
|
},
|
|
578
622
|
},
|
|
579
623
|
},
|
|
624
|
+
annotations: {
|
|
625
|
+
readOnlyHint: true,
|
|
626
|
+
openWorldHint: false,
|
|
627
|
+
},
|
|
580
628
|
},
|
|
581
629
|
];
|
|
582
630
|
// Add MCP-specific tools if enabled
|
|
@@ -593,6 +641,10 @@ export class RubberDuckServer {
|
|
|
593
641
|
},
|
|
594
642
|
},
|
|
595
643
|
},
|
|
644
|
+
annotations: {
|
|
645
|
+
readOnlyHint: true,
|
|
646
|
+
openWorldHint: false,
|
|
647
|
+
},
|
|
596
648
|
}, {
|
|
597
649
|
name: 'approve_mcp_request',
|
|
598
650
|
description: "Approve or deny a duck's MCP tool request",
|
|
@@ -615,6 +667,10 @@ export class RubberDuckServer {
|
|
|
615
667
|
},
|
|
616
668
|
required: ['approval_id', 'decision'],
|
|
617
669
|
},
|
|
670
|
+
annotations: {
|
|
671
|
+
idempotentHint: true,
|
|
672
|
+
openWorldHint: false,
|
|
673
|
+
},
|
|
618
674
|
}, {
|
|
619
675
|
name: 'mcp_status',
|
|
620
676
|
description: 'Get status of MCP bridge, servers, and pending approvals',
|
|
@@ -622,6 +678,10 @@ export class RubberDuckServer {
|
|
|
622
678
|
type: 'object',
|
|
623
679
|
properties: {},
|
|
624
680
|
},
|
|
681
|
+
annotations: {
|
|
682
|
+
readOnlyHint: true,
|
|
683
|
+
openWorldHint: true,
|
|
684
|
+
},
|
|
625
685
|
});
|
|
626
686
|
}
|
|
627
687
|
return baseTools;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/server.ts
CHANGED
|
@@ -412,6 +412,10 @@ export class RubberDuckServer {
|
|
|
412
412
|
},
|
|
413
413
|
required: ['prompt'],
|
|
414
414
|
},
|
|
415
|
+
annotations: {
|
|
416
|
+
readOnlyHint: true,
|
|
417
|
+
openWorldHint: true,
|
|
418
|
+
},
|
|
415
419
|
},
|
|
416
420
|
{
|
|
417
421
|
name: 'chat_with_duck',
|
|
@@ -438,6 +442,9 @@ export class RubberDuckServer {
|
|
|
438
442
|
},
|
|
439
443
|
required: ['conversation_id', 'message'],
|
|
440
444
|
},
|
|
445
|
+
annotations: {
|
|
446
|
+
openWorldHint: true,
|
|
447
|
+
},
|
|
441
448
|
},
|
|
442
449
|
{
|
|
443
450
|
name: 'clear_conversations',
|
|
@@ -446,6 +453,11 @@ export class RubberDuckServer {
|
|
|
446
453
|
type: 'object',
|
|
447
454
|
properties: {},
|
|
448
455
|
},
|
|
456
|
+
annotations: {
|
|
457
|
+
destructiveHint: true,
|
|
458
|
+
idempotentHint: true,
|
|
459
|
+
openWorldHint: false,
|
|
460
|
+
},
|
|
449
461
|
},
|
|
450
462
|
{
|
|
451
463
|
name: 'list_ducks',
|
|
@@ -460,6 +472,10 @@ export class RubberDuckServer {
|
|
|
460
472
|
},
|
|
461
473
|
},
|
|
462
474
|
},
|
|
475
|
+
annotations: {
|
|
476
|
+
readOnlyHint: true,
|
|
477
|
+
openWorldHint: true,
|
|
478
|
+
},
|
|
463
479
|
},
|
|
464
480
|
{
|
|
465
481
|
name: 'list_models',
|
|
@@ -478,6 +494,10 @@ export class RubberDuckServer {
|
|
|
478
494
|
},
|
|
479
495
|
},
|
|
480
496
|
},
|
|
497
|
+
annotations: {
|
|
498
|
+
readOnlyHint: true,
|
|
499
|
+
openWorldHint: true,
|
|
500
|
+
},
|
|
481
501
|
},
|
|
482
502
|
{
|
|
483
503
|
name: 'compare_ducks',
|
|
@@ -503,6 +523,10 @@ export class RubberDuckServer {
|
|
|
503
523
|
},
|
|
504
524
|
required: ['prompt'],
|
|
505
525
|
},
|
|
526
|
+
annotations: {
|
|
527
|
+
readOnlyHint: true,
|
|
528
|
+
openWorldHint: true,
|
|
529
|
+
},
|
|
506
530
|
},
|
|
507
531
|
{
|
|
508
532
|
name: 'duck_council',
|
|
@@ -521,6 +545,10 @@ export class RubberDuckServer {
|
|
|
521
545
|
},
|
|
522
546
|
required: ['prompt'],
|
|
523
547
|
},
|
|
548
|
+
annotations: {
|
|
549
|
+
readOnlyHint: true,
|
|
550
|
+
openWorldHint: true,
|
|
551
|
+
},
|
|
524
552
|
},
|
|
525
553
|
{
|
|
526
554
|
name: 'duck_vote',
|
|
@@ -552,6 +580,10 @@ export class RubberDuckServer {
|
|
|
552
580
|
},
|
|
553
581
|
required: ['question', 'options'],
|
|
554
582
|
},
|
|
583
|
+
annotations: {
|
|
584
|
+
readOnlyHint: true,
|
|
585
|
+
openWorldHint: true,
|
|
586
|
+
},
|
|
555
587
|
},
|
|
556
588
|
{
|
|
557
589
|
name: 'duck_judge',
|
|
@@ -590,6 +622,10 @@ export class RubberDuckServer {
|
|
|
590
622
|
},
|
|
591
623
|
required: ['responses'],
|
|
592
624
|
},
|
|
625
|
+
annotations: {
|
|
626
|
+
readOnlyHint: true,
|
|
627
|
+
openWorldHint: true,
|
|
628
|
+
},
|
|
593
629
|
},
|
|
594
630
|
{
|
|
595
631
|
name: 'duck_iterate',
|
|
@@ -623,6 +659,10 @@ export class RubberDuckServer {
|
|
|
623
659
|
},
|
|
624
660
|
required: ['prompt', 'providers', 'mode'],
|
|
625
661
|
},
|
|
662
|
+
annotations: {
|
|
663
|
+
readOnlyHint: true,
|
|
664
|
+
openWorldHint: true,
|
|
665
|
+
},
|
|
626
666
|
},
|
|
627
667
|
{
|
|
628
668
|
name: 'duck_debate',
|
|
@@ -659,6 +699,10 @@ export class RubberDuckServer {
|
|
|
659
699
|
},
|
|
660
700
|
required: ['prompt', 'format'],
|
|
661
701
|
},
|
|
702
|
+
annotations: {
|
|
703
|
+
readOnlyHint: true,
|
|
704
|
+
openWorldHint: true,
|
|
705
|
+
},
|
|
662
706
|
},
|
|
663
707
|
{
|
|
664
708
|
name: 'get_usage_stats',
|
|
@@ -675,6 +719,10 @@ export class RubberDuckServer {
|
|
|
675
719
|
},
|
|
676
720
|
},
|
|
677
721
|
},
|
|
722
|
+
annotations: {
|
|
723
|
+
readOnlyHint: true,
|
|
724
|
+
openWorldHint: false,
|
|
725
|
+
},
|
|
678
726
|
},
|
|
679
727
|
];
|
|
680
728
|
|
|
@@ -693,6 +741,10 @@ export class RubberDuckServer {
|
|
|
693
741
|
},
|
|
694
742
|
},
|
|
695
743
|
},
|
|
744
|
+
annotations: {
|
|
745
|
+
readOnlyHint: true,
|
|
746
|
+
openWorldHint: false,
|
|
747
|
+
},
|
|
696
748
|
},
|
|
697
749
|
{
|
|
698
750
|
name: 'approve_mcp_request',
|
|
@@ -716,6 +768,10 @@ export class RubberDuckServer {
|
|
|
716
768
|
},
|
|
717
769
|
required: ['approval_id', 'decision'],
|
|
718
770
|
},
|
|
771
|
+
annotations: {
|
|
772
|
+
idempotentHint: true,
|
|
773
|
+
openWorldHint: false,
|
|
774
|
+
},
|
|
719
775
|
},
|
|
720
776
|
{
|
|
721
777
|
name: 'mcp_status',
|
|
@@ -724,6 +780,10 @@ export class RubberDuckServer {
|
|
|
724
780
|
type: 'object',
|
|
725
781
|
properties: {},
|
|
726
782
|
},
|
|
783
|
+
annotations: {
|
|
784
|
+
readOnlyHint: true,
|
|
785
|
+
openWorldHint: true,
|
|
786
|
+
},
|
|
727
787
|
}
|
|
728
788
|
);
|
|
729
789
|
}
|
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
import { describe, it, expect, jest, beforeEach } from '@jest/globals';
|
|
2
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
|
|
4
|
+
// We need to test the tool annotations from RubberDuckServer
|
|
5
|
+
// Since getTools() is a private method, we'll test through the server's tool listing
|
|
6
|
+
|
|
7
|
+
// Mock dependencies before importing the server
|
|
8
|
+
jest.mock('../src/utils/logger');
|
|
9
|
+
jest.mock('../src/services/mcp-client-manager.js');
|
|
10
|
+
jest.mock('../src/services/approval.js');
|
|
11
|
+
jest.mock('../src/services/function-bridge.js');
|
|
12
|
+
|
|
13
|
+
// Import after mocking
|
|
14
|
+
import { RubberDuckServer } from '../src/server.js';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Tool Annotations Test Suite
|
|
18
|
+
*
|
|
19
|
+
* These tests verify that tool annotations correctly describe each tool's behavior
|
|
20
|
+
* according to the MCP specification. The annotations are:
|
|
21
|
+
*
|
|
22
|
+
* - readOnlyHint: Tool does not modify server state
|
|
23
|
+
* - destructiveHint: Tool performs irreversible operations
|
|
24
|
+
* - idempotentHint: Calling repeatedly with same args has no additional effect
|
|
25
|
+
* - openWorldHint: Tool accesses external systems (APIs, network, etc.)
|
|
26
|
+
*
|
|
27
|
+
* Test logic is based on analyzing what each tool actually does, not just
|
|
28
|
+
* checking the code. Each test documents WHY the annotation should be set.
|
|
29
|
+
*/
|
|
30
|
+
describe('Tool Annotations', () => {
|
|
31
|
+
let server: RubberDuckServer;
|
|
32
|
+
let tools: Tool[];
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
// Set up minimal environment for server initialization
|
|
36
|
+
process.env.OPENAI_API_KEY = 'test-key';
|
|
37
|
+
|
|
38
|
+
server = new RubberDuckServer();
|
|
39
|
+
|
|
40
|
+
// Access private getTools method via reflection for testing
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
tools = (server as any).getTools();
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Helper to find a tool by name
|
|
46
|
+
const findTool = (name: string): Tool | undefined => {
|
|
47
|
+
return tools.find((t) => t.name === name);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
describe('All tools should have annotations', () => {
|
|
51
|
+
it('should have annotations defined for every tool', () => {
|
|
52
|
+
// Every tool should have an annotations object (even if empty would be valid,
|
|
53
|
+
// we're being explicit about behavior for all tools)
|
|
54
|
+
for (const tool of tools) {
|
|
55
|
+
expect(tool.annotations).toBeDefined();
|
|
56
|
+
expect(typeof tool.annotations).toBe('object');
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
describe('ask_duck', () => {
|
|
62
|
+
/**
|
|
63
|
+
* ask_duck queries an external LLM API and returns a response.
|
|
64
|
+
* It does use an internal cache, but this is transparent optimization,
|
|
65
|
+
* not user-facing state modification.
|
|
66
|
+
*
|
|
67
|
+
* - readOnlyHint: true - Does not modify user-visible state
|
|
68
|
+
* - openWorldHint: true - Calls external LLM APIs
|
|
69
|
+
*/
|
|
70
|
+
it('should be marked as read-only because it only retrieves information', () => {
|
|
71
|
+
const tool = findTool('ask_duck');
|
|
72
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
76
|
+
const tool = findTool('ask_duck');
|
|
77
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('should NOT be marked as destructive', () => {
|
|
81
|
+
const tool = findTool('ask_duck');
|
|
82
|
+
expect(tool?.annotations?.destructiveHint).toBeUndefined();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe('chat_with_duck', () => {
|
|
87
|
+
/**
|
|
88
|
+
* chat_with_duck creates/modifies conversation state (adds messages).
|
|
89
|
+
* It also calls external LLM APIs.
|
|
90
|
+
*
|
|
91
|
+
* - readOnlyHint: NOT set - Modifies conversation state
|
|
92
|
+
* - openWorldHint: true - Calls external LLM APIs
|
|
93
|
+
*/
|
|
94
|
+
it('should NOT be marked as read-only because it modifies conversation state', () => {
|
|
95
|
+
const tool = findTool('chat_with_duck');
|
|
96
|
+
// readOnlyHint should be undefined or false (not true)
|
|
97
|
+
expect(tool?.annotations?.readOnlyHint).not.toBe(true);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
101
|
+
const tool = findTool('chat_with_duck');
|
|
102
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
describe('clear_conversations', () => {
|
|
107
|
+
/**
|
|
108
|
+
* clear_conversations deletes all conversation history.
|
|
109
|
+
* This is an irreversible, destructive operation.
|
|
110
|
+
*
|
|
111
|
+
* - destructiveHint: true - Irreversibly deletes data
|
|
112
|
+
* - idempotentHint: true - Clearing already-empty state has no additional effect
|
|
113
|
+
* - openWorldHint: NOT set - Pure local operation
|
|
114
|
+
*/
|
|
115
|
+
it('should be marked as destructive because it irreversibly deletes conversations', () => {
|
|
116
|
+
const tool = findTool('clear_conversations');
|
|
117
|
+
expect(tool?.annotations?.destructiveHint).toBe(true);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it('should be marked as idempotent because clearing twice has no additional effect', () => {
|
|
121
|
+
const tool = findTool('clear_conversations');
|
|
122
|
+
expect(tool?.annotations?.idempotentHint).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('should be explicitly marked as NOT open-world because it is a local operation', () => {
|
|
126
|
+
const tool = findTool('clear_conversations');
|
|
127
|
+
expect(tool?.annotations?.openWorldHint).toBe(false);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should NOT be marked as read-only because it deletes data', () => {
|
|
131
|
+
const tool = findTool('clear_conversations');
|
|
132
|
+
expect(tool?.annotations?.readOnlyHint).toBeUndefined();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
describe('list_ducks', () => {
|
|
137
|
+
/**
|
|
138
|
+
* list_ducks returns configured providers and optionally performs health checks.
|
|
139
|
+
* Health checks make API calls to verify provider connectivity.
|
|
140
|
+
*
|
|
141
|
+
* - readOnlyHint: true - Only reads provider configuration
|
|
142
|
+
* - openWorldHint: true - Can make health check API calls
|
|
143
|
+
*/
|
|
144
|
+
it('should be marked as read-only because it only reads provider info', () => {
|
|
145
|
+
const tool = findTool('list_ducks');
|
|
146
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should be marked as open-world because health checks call external APIs', () => {
|
|
150
|
+
const tool = findTool('list_ducks');
|
|
151
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
describe('list_models', () => {
|
|
156
|
+
/**
|
|
157
|
+
* list_models returns available models and can fetch from external APIs.
|
|
158
|
+
*
|
|
159
|
+
* - readOnlyHint: true - Only reads model information
|
|
160
|
+
* - openWorldHint: true - Can fetch models from external APIs
|
|
161
|
+
*/
|
|
162
|
+
it('should be marked as read-only because it only reads model info', () => {
|
|
163
|
+
const tool = findTool('list_models');
|
|
164
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('should be marked as open-world because it can fetch from external APIs', () => {
|
|
168
|
+
const tool = findTool('list_models');
|
|
169
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
describe('compare_ducks', () => {
|
|
174
|
+
/**
|
|
175
|
+
* compare_ducks queries multiple LLM providers simultaneously.
|
|
176
|
+
*
|
|
177
|
+
* - readOnlyHint: true - Does not modify state
|
|
178
|
+
* - openWorldHint: true - Calls multiple external LLM APIs
|
|
179
|
+
*/
|
|
180
|
+
it('should be marked as read-only because it only retrieves responses', () => {
|
|
181
|
+
const tool = findTool('compare_ducks');
|
|
182
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
186
|
+
const tool = findTool('compare_ducks');
|
|
187
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
describe('duck_council', () => {
|
|
192
|
+
/**
|
|
193
|
+
* duck_council queries all configured LLM providers.
|
|
194
|
+
*
|
|
195
|
+
* - readOnlyHint: true - Does not modify state
|
|
196
|
+
* - openWorldHint: true - Calls multiple external LLM APIs
|
|
197
|
+
*/
|
|
198
|
+
it('should be marked as read-only because it only retrieves responses', () => {
|
|
199
|
+
const tool = findTool('duck_council');
|
|
200
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
204
|
+
const tool = findTool('duck_council');
|
|
205
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
describe('duck_vote', () => {
|
|
210
|
+
/**
|
|
211
|
+
* duck_vote has multiple LLMs vote on options.
|
|
212
|
+
*
|
|
213
|
+
* - readOnlyHint: true - Does not modify state
|
|
214
|
+
* - openWorldHint: true - Calls multiple external LLM APIs
|
|
215
|
+
*/
|
|
216
|
+
it('should be marked as read-only because it only retrieves votes', () => {
|
|
217
|
+
const tool = findTool('duck_vote');
|
|
218
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
222
|
+
const tool = findTool('duck_vote');
|
|
223
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
describe('duck_judge', () => {
|
|
228
|
+
/**
|
|
229
|
+
* duck_judge has one LLM evaluate and rank responses.
|
|
230
|
+
*
|
|
231
|
+
* - readOnlyHint: true - Does not modify state
|
|
232
|
+
* - openWorldHint: true - Calls external LLM API
|
|
233
|
+
*/
|
|
234
|
+
it('should be marked as read-only because it only retrieves evaluation', () => {
|
|
235
|
+
const tool = findTool('duck_judge');
|
|
236
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('should be marked as open-world because it calls external LLM API', () => {
|
|
240
|
+
const tool = findTool('duck_judge');
|
|
241
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
describe('duck_iterate', () => {
|
|
246
|
+
/**
|
|
247
|
+
* duck_iterate performs iterative refinement between two LLMs.
|
|
248
|
+
*
|
|
249
|
+
* - readOnlyHint: true - Does not modify persistent state
|
|
250
|
+
* - openWorldHint: true - Calls multiple external LLM APIs
|
|
251
|
+
*/
|
|
252
|
+
it('should be marked as read-only because it only retrieves refined responses', () => {
|
|
253
|
+
const tool = findTool('duck_iterate');
|
|
254
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
258
|
+
const tool = findTool('duck_iterate');
|
|
259
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
describe('duck_debate', () => {
|
|
264
|
+
/**
|
|
265
|
+
* duck_debate runs a structured debate between multiple LLMs.
|
|
266
|
+
*
|
|
267
|
+
* - readOnlyHint: true - Does not modify persistent state
|
|
268
|
+
* - openWorldHint: true - Calls multiple external LLM APIs
|
|
269
|
+
*/
|
|
270
|
+
it('should be marked as read-only because it only retrieves debate content', () => {
|
|
271
|
+
const tool = findTool('duck_debate');
|
|
272
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('should be marked as open-world because it calls external LLM APIs', () => {
|
|
276
|
+
const tool = findTool('duck_debate');
|
|
277
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
describe('get_usage_stats', () => {
|
|
282
|
+
/**
|
|
283
|
+
* get_usage_stats retrieves local usage statistics.
|
|
284
|
+
* It does not make any external calls.
|
|
285
|
+
*
|
|
286
|
+
* - readOnlyHint: true - Only reads local data
|
|
287
|
+
* - openWorldHint: NOT set - Pure local operation
|
|
288
|
+
*/
|
|
289
|
+
it('should be marked as read-only because it only reads statistics', () => {
|
|
290
|
+
const tool = findTool('get_usage_stats');
|
|
291
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it('should be explicitly marked as NOT open-world because it only reads local data', () => {
|
|
295
|
+
const tool = findTool('get_usage_stats');
|
|
296
|
+
expect(tool?.annotations?.openWorldHint).toBe(false);
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
describe('Annotation consistency', () => {
|
|
301
|
+
/**
|
|
302
|
+
* These tests verify logical consistency of annotations across tools
|
|
303
|
+
*/
|
|
304
|
+
|
|
305
|
+
it('tools that call LLM APIs should have openWorldHint', () => {
|
|
306
|
+
const llmTools = [
|
|
307
|
+
'ask_duck',
|
|
308
|
+
'chat_with_duck',
|
|
309
|
+
'compare_ducks',
|
|
310
|
+
'duck_council',
|
|
311
|
+
'duck_vote',
|
|
312
|
+
'duck_judge',
|
|
313
|
+
'duck_iterate',
|
|
314
|
+
'duck_debate',
|
|
315
|
+
];
|
|
316
|
+
|
|
317
|
+
for (const toolName of llmTools) {
|
|
318
|
+
const tool = findTool(toolName);
|
|
319
|
+
expect(tool?.annotations?.openWorldHint).toBe(true);
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it('tools that only read data should have readOnlyHint', () => {
|
|
324
|
+
const readOnlyTools = [
|
|
325
|
+
'ask_duck',
|
|
326
|
+
'list_ducks',
|
|
327
|
+
'list_models',
|
|
328
|
+
'compare_ducks',
|
|
329
|
+
'duck_council',
|
|
330
|
+
'duck_vote',
|
|
331
|
+
'duck_judge',
|
|
332
|
+
'duck_iterate',
|
|
333
|
+
'duck_debate',
|
|
334
|
+
'get_usage_stats',
|
|
335
|
+
];
|
|
336
|
+
|
|
337
|
+
for (const toolName of readOnlyTools) {
|
|
338
|
+
const tool = findTool(toolName);
|
|
339
|
+
expect(tool?.annotations?.readOnlyHint).toBe(true);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
it('only clear_conversations should be marked as destructive', () => {
|
|
344
|
+
const destructiveTools = tools.filter(
|
|
345
|
+
(t) => t.annotations?.destructiveHint === true
|
|
346
|
+
);
|
|
347
|
+
expect(destructiveTools).toHaveLength(1);
|
|
348
|
+
expect(destructiveTools[0].name).toBe('clear_conversations');
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
it('chat_with_duck should NOT be read-only (it modifies conversation state)', () => {
|
|
352
|
+
const tool = findTool('chat_with_duck');
|
|
353
|
+
expect(tool?.annotations?.readOnlyHint).not.toBe(true);
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
describe('Base tools count', () => {
|
|
358
|
+
it('should have 12 base tools', () => {
|
|
359
|
+
// Base tools (without MCP-specific tools which are conditionally added)
|
|
360
|
+
const baseToolNames = [
|
|
361
|
+
'ask_duck',
|
|
362
|
+
'chat_with_duck',
|
|
363
|
+
'clear_conversations',
|
|
364
|
+
'list_ducks',
|
|
365
|
+
'list_models',
|
|
366
|
+
'compare_ducks',
|
|
367
|
+
'duck_council',
|
|
368
|
+
'duck_vote',
|
|
369
|
+
'duck_judge',
|
|
370
|
+
'duck_iterate',
|
|
371
|
+
'duck_debate',
|
|
372
|
+
'get_usage_stats',
|
|
373
|
+
];
|
|
374
|
+
|
|
375
|
+
for (const name of baseToolNames) {
|
|
376
|
+
expect(findTool(name)).toBeDefined();
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
describe('MCP-specific Tool Annotations', () => {
|
|
383
|
+
let server: RubberDuckServer;
|
|
384
|
+
let tools: Tool[];
|
|
385
|
+
|
|
386
|
+
beforeEach(() => {
|
|
387
|
+
// Enable MCP bridge for these tests
|
|
388
|
+
process.env.OPENAI_API_KEY = 'test-key';
|
|
389
|
+
process.env.MCP_BRIDGE_ENABLED = 'true';
|
|
390
|
+
|
|
391
|
+
// Need to mock MCP components for initialization
|
|
392
|
+
jest.resetModules();
|
|
393
|
+
|
|
394
|
+
server = new RubberDuckServer();
|
|
395
|
+
|
|
396
|
+
// Access private getTools method via reflection for testing
|
|
397
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
398
|
+
tools = (server as any).getTools();
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
afterEach(() => {
|
|
402
|
+
delete process.env.MCP_BRIDGE_ENABLED;
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// Helper to find a tool by name
|
|
406
|
+
const findTool = (name: string): Tool | undefined => {
|
|
407
|
+
return tools.find((t) => t.name === name);
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
// Note: MCP tools are only added when mcpEnabled is true in the server
|
|
411
|
+
// These tests may not find the tools if MCP is not properly initialized
|
|
412
|
+
|
|
413
|
+
describe('get_pending_approvals (when MCP enabled)', () => {
|
|
414
|
+
/**
|
|
415
|
+
* get_pending_approvals reads the list of pending approval requests.
|
|
416
|
+
*
|
|
417
|
+
* - readOnlyHint: true - Only reads approval state
|
|
418
|
+
* - openWorldHint: NOT set - Pure local operation
|
|
419
|
+
*/
|
|
420
|
+
it('should be marked as read-only when present', () => {
|
|
421
|
+
const tool = findTool('get_pending_approvals');
|
|
422
|
+
if (tool) {
|
|
423
|
+
expect(tool.annotations?.readOnlyHint).toBe(true);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('should be explicitly marked as NOT open-world when present', () => {
|
|
428
|
+
const tool = findTool('get_pending_approvals');
|
|
429
|
+
if (tool) {
|
|
430
|
+
expect(tool.annotations?.openWorldHint).toBe(false);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
|
|
435
|
+
describe('approve_mcp_request (when MCP enabled)', () => {
|
|
436
|
+
/**
|
|
437
|
+
* approve_mcp_request approves or denies a pending request.
|
|
438
|
+
* Approving twice has no additional effect (the request stays approved).
|
|
439
|
+
*
|
|
440
|
+
* - idempotentHint: true - Approving already-approved request has no effect
|
|
441
|
+
* - readOnlyHint: NOT set - Modifies approval state
|
|
442
|
+
* - openWorldHint: NOT set - Pure local operation
|
|
443
|
+
*/
|
|
444
|
+
it('should be marked as idempotent when present', () => {
|
|
445
|
+
const tool = findTool('approve_mcp_request');
|
|
446
|
+
if (tool) {
|
|
447
|
+
expect(tool.annotations?.idempotentHint).toBe(true);
|
|
448
|
+
}
|
|
449
|
+
});
|
|
450
|
+
|
|
451
|
+
it('should NOT be marked as read-only when present', () => {
|
|
452
|
+
const tool = findTool('approve_mcp_request');
|
|
453
|
+
if (tool) {
|
|
454
|
+
expect(tool.annotations?.readOnlyHint).toBeUndefined();
|
|
455
|
+
}
|
|
456
|
+
});
|
|
457
|
+
|
|
458
|
+
it('should be explicitly marked as NOT open-world when present', () => {
|
|
459
|
+
const tool = findTool('approve_mcp_request');
|
|
460
|
+
if (tool) {
|
|
461
|
+
expect(tool.annotations?.openWorldHint).toBe(false);
|
|
462
|
+
}
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
describe('mcp_status (when MCP enabled)', () => {
|
|
467
|
+
/**
|
|
468
|
+
* mcp_status retrieves the status of MCP servers and pending approvals.
|
|
469
|
+
* It queries connected MCP servers to list available tools.
|
|
470
|
+
*
|
|
471
|
+
* - readOnlyHint: true - Only reads status information
|
|
472
|
+
* - openWorldHint: true - Communicates with MCP servers
|
|
473
|
+
*/
|
|
474
|
+
it('should be marked as read-only when present', () => {
|
|
475
|
+
const tool = findTool('mcp_status');
|
|
476
|
+
if (tool) {
|
|
477
|
+
expect(tool.annotations?.readOnlyHint).toBe(true);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
|
|
481
|
+
it('should be marked as open-world when present', () => {
|
|
482
|
+
const tool = findTool('mcp_status');
|
|
483
|
+
if (tool) {
|
|
484
|
+
expect(tool.annotations?.openWorldHint).toBe(true);
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
});
|