Repository navigation
Commit 2bc2bdb
committed
[Server][Capability] Defer loading into a custom registry
`setLazyLoading()` defaults to true but never applied to a registry
supplied through `setRegistry()`: the builder ran the chain loader itself
and set `$eagerlyLoaded = true`, because it could not hand a loader to an
instance it did not construct.
Two consequences under a persistent runtime. The loaders run once at
build, so a source that is not ready yet (a cold metadata cache) freezes
the registry empty for the whole process and `tools/list` keeps returning
`[]`. And `detectCapabilities()` reads `hasTools()` off that cold
registry, so the server can advertise `tools: false` and a client that
respects capabilities never calls `tools/list` at all.
`Registry::deferLoadingFrom()` adopts a loader after construction, so the
builder can defer instead of loading eagerly. It chains behind a loader
the constructor took while that one is still owed its run, and replaces
it once it has already run, since chaining would run it twice and
discovery would rescan. Resetting `loaded` is what lets the adopted
loader run on the next read: without it, a registry read before `build()`
would keep the deferred loader forever unrun.
Deferral is not conditional on the registry being empty. Gating it that
way would mean a caller who hand-registers a single element before
`setRegistry()` silently falls back to eager loading and gets the
cold-source bug back. Instead `Registry::isEmpty()` — which reads the
element arrays directly and so does not trigger the loader — tells
`detectCapabilities()` that a deferred registry already holds elements,
and it advertises them as one more opaque source. That over-advertises a
registry holding only one kind, which is harmless per MCP semantics and
already how custom loaders and discovery are treated.
A foreign `RegistryInterface` cannot be deferred into and still loads
eagerly. `RegistryInterface` is unchanged: both methods live on
`Registry`, which is what the builder already type-checks for
`loadFrom()`.1 parent c5dbfb6 commit 2bc2bdb
4 files changed
Lines changed: 233 additions & 15 deletions
File tree
- src
- Capability
- Server
- tests/Unit
- Capability
- Server
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
| 14 | + | |
14 | 15 | | |
15 | 16 | | |
16 | 17 | | |
| |||
69 | 70 | | |
70 | 71 | | |
71 | 72 | | |
72 | | - | |
| 73 | + | |
73 | 74 | | |
74 | 75 | | |
75 | 76 | | |
| |||
114 | 115 | | |
115 | 116 | | |
116 | 117 | | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
117 | 140 | | |
118 | 141 | | |
119 | 142 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
522 | 522 | | |
523 | 523 | | |
524 | 524 | | |
525 | | - | |
526 | | - | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
527 | 528 | | |
528 | 529 | | |
529 | 530 | | |
| |||
1043 | 1044 | | |
1044 | 1045 | | |
1045 | 1046 | | |
| 1047 | + | |
1046 | 1048 | | |
1047 | 1049 | | |
1048 | | - | |
1049 | | - | |
1050 | 1050 | | |
1051 | | - | |
1052 | | - | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
1053 | 1056 | | |
1054 | | - | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
1055 | 1065 | | |
1056 | | - | |
1057 | 1066 | | |
1058 | 1067 | | |
1059 | 1068 | | |
| |||
1064 | 1073 | | |
1065 | 1074 | | |
1066 | 1075 | | |
1067 | | - | |
| 1076 | + | |
1068 | 1077 | | |
1069 | 1078 | | |
1070 | 1079 | | |
| |||
1118 | 1127 | | |
1119 | 1128 | | |
1120 | 1129 | | |
1121 | | - | |
| 1130 | + | |
| 1131 | + | |
| 1132 | + | |
1122 | 1133 | | |
1123 | | - | |
| 1134 | + | |
1124 | 1135 | | |
1125 | 1136 | | |
1126 | 1137 | | |
| |||
1143 | 1154 | | |
1144 | 1155 | | |
1145 | 1156 | | |
1146 | | - | |
| 1157 | + | |
1147 | 1158 | | |
1148 | 1159 | | |
1149 | 1160 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
853 | 853 | | |
854 | 854 | | |
855 | 855 | | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
| 925 | + | |
| 926 | + | |
| 927 | + | |
| 928 | + | |
| 929 | + | |
| 930 | + | |
| 931 | + | |
| 932 | + | |
| 933 | + | |
| 934 | + | |
| 935 | + | |
| 936 | + | |
| 937 | + | |
| 938 | + | |
| 939 | + | |
| 940 | + | |
| 941 | + | |
| 942 | + | |
| 943 | + | |
| 944 | + | |
| 945 | + | |
| 946 | + | |
| 947 | + | |
| 948 | + | |
| 949 | + | |
| 950 | + | |
| 951 | + | |
| 952 | + | |
| 953 | + | |
856 | 954 | | |
857 | 955 | | |
858 | 956 | | |
| |||
907 | 1005 | | |
908 | 1006 | | |
909 | 1007 | | |
910 | | - | |
| 1008 | + | |
911 | 1009 | | |
912 | 1010 | | |
913 | 1011 | | |
| |||
919 | 1017 | | |
920 | 1018 | | |
921 | 1019 | | |
922 | | - | |
| 1020 | + | |
923 | 1021 | | |
924 | 1022 | | |
925 | 1023 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
443 | 443 | | |
444 | 444 | | |
445 | 445 | | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
| 505 | + | |
| 506 | + | |
| 507 | + | |
| 508 | + | |
| 509 | + | |
| 510 | + | |
| 511 | + | |
| 512 | + | |
| 513 | + | |
| 514 | + | |
| 515 | + | |
| 516 | + | |
| 517 | + | |
| 518 | + | |
| 519 | + | |
| 520 | + | |
| 521 | + | |
| 522 | + | |
| 523 | + | |
| 524 | + | |
| 525 | + | |
| 526 | + | |
| 527 | + | |
| 528 | + | |
| 529 | + | |
| 530 | + | |
| 531 | + | |
446 | 532 | | |
447 | 533 | | |
448 | 534 | | |
| |||
0 commit comments