@happykiller/sunny-mcp 0.2.3 → 0.2.5
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/resource/metadata.d.ts +30 -2
- package/dist/resource/metadata.d.ts.map +1 -1
- package/dist/resource/metadata.js +52 -3
- package/dist/resource/metadata.js.map +1 -1
- package/dist/safety/target.d.ts +12 -1
- package/dist/safety/target.d.ts.map +1 -1
- package/dist/safety/target.js.map +1 -1
- package/dist/server/createMcpServer.d.ts.map +1 -1
- package/dist/server/createMcpServer.js +6 -2
- package/dist/server/createMcpServer.js.map +1 -1
- package/dist/server/transport.d.ts +6 -6
- package/dist/server/transport.d.ts.map +1 -1
- package/dist/server/transport.js +24 -20
- package/dist/server/transport.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { OAuthProtectedResourceMetadata } from
|
|
1
|
+
import type { OAuthProtectedResourceMetadata } from "@modelcontextprotocol/sdk/shared/auth.js";
|
|
2
2
|
export interface OptionsMetadonnees {
|
|
3
3
|
/** URI canonique de ce serveur — l'audience que porteront ses jetons. */
|
|
4
4
|
resource: string;
|
|
@@ -9,6 +9,34 @@ export interface OptionsMetadonnees {
|
|
|
9
9
|
resourceName?: string;
|
|
10
10
|
}
|
|
11
11
|
export declare function metadonneesRessource(opts: OptionsMetadonnees): OAuthProtectedResourceMetadata;
|
|
12
|
-
/**
|
|
12
|
+
/** Racine du document. Emplacement normatif d'une ressource SANS chemin. */
|
|
13
13
|
export declare const CHEMIN_METADONNEES = "/.well-known/oauth-protected-resource";
|
|
14
|
+
/**
|
|
15
|
+
* Où servir le document, pour une ressource donnée.
|
|
16
|
+
*
|
|
17
|
+
* RFC 9728 §3.1 : l'URL des métadonnées se forme en INSÉRANT le well-known
|
|
18
|
+
* entre l'hôte et le chemin de la ressource. Pour `https://hote/mcp`,
|
|
19
|
+
* l'emplacement normatif est donc `/.well-known/oauth-protected-resource/mcp`,
|
|
20
|
+
* et la racine ne vaut que pour une ressource servie à `/`.
|
|
21
|
+
*
|
|
22
|
+
* Ne servir que la racine ne se voit pas tout de suite : le SDK MCP essaie
|
|
23
|
+
* d'abord la forme avec chemin, puis retombe sur la racine devant un 4xx. La
|
|
24
|
+
* conformité repose alors sur le repli d'un client particulier — un client
|
|
25
|
+
* strict, ou une version qui resserre ce repli, ne trouve rien. C'est le même
|
|
26
|
+
* raisonnement que pour la découverte du serveur d'autorisation : le document
|
|
27
|
+
* que lit un client fidèle à la spécification ne doit pas être celui qui manque.
|
|
28
|
+
*
|
|
29
|
+
* Les deux emplacements sont servis, le plus spécifique en premier : monté par
|
|
30
|
+
* préfixe, un handler posé sur la racine capterait le chemin sans savoir y
|
|
31
|
+
* répondre.
|
|
32
|
+
*/
|
|
33
|
+
export declare function cheminsMetadonnees(resource: string): string[];
|
|
34
|
+
/**
|
|
35
|
+
* URL absolue du document, telle qu'on l'annonce dans `WWW-Authenticate`.
|
|
36
|
+
*
|
|
37
|
+
* Dérivée de la ressource, et non fabriquée en retirant un suffixe supposé :
|
|
38
|
+
* un serveur monté ailleurs que sur `/mcp` recevait sinon une adresse fausse
|
|
39
|
+
* dans le seul en-tête qui dise au client où aller s'authentifier.
|
|
40
|
+
*/
|
|
41
|
+
export declare function urlMetadonnees(resource: string): string;
|
|
14
42
|
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/resource/metadata.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAE/F,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,GACvB,8BAA8B,CAQhC;AAED,
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/resource/metadata.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAE/F,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,6DAA6D;IAC7D,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,kBAAkB,GACvB,8BAA8B,CAQhC;AAED,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,0CAA0C,CAAC;AAE1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAY7D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAOvD"}
|
|
@@ -3,10 +3,59 @@ export function metadonneesRessource(opts) {
|
|
|
3
3
|
resource: opts.resource,
|
|
4
4
|
authorization_servers: opts.authorizationServers,
|
|
5
5
|
scopes_supported: opts.scopesSupported,
|
|
6
|
-
bearer_methods_supported: [
|
|
6
|
+
bearer_methods_supported: ["header"],
|
|
7
7
|
resource_name: opts.resourceName,
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
/**
|
|
11
|
-
export const CHEMIN_METADONNEES =
|
|
10
|
+
/** Racine du document. Emplacement normatif d'une ressource SANS chemin. */
|
|
11
|
+
export const CHEMIN_METADONNEES = "/.well-known/oauth-protected-resource";
|
|
12
|
+
/**
|
|
13
|
+
* Où servir le document, pour une ressource donnée.
|
|
14
|
+
*
|
|
15
|
+
* RFC 9728 §3.1 : l'URL des métadonnées se forme en INSÉRANT le well-known
|
|
16
|
+
* entre l'hôte et le chemin de la ressource. Pour `https://hote/mcp`,
|
|
17
|
+
* l'emplacement normatif est donc `/.well-known/oauth-protected-resource/mcp`,
|
|
18
|
+
* et la racine ne vaut que pour une ressource servie à `/`.
|
|
19
|
+
*
|
|
20
|
+
* Ne servir que la racine ne se voit pas tout de suite : le SDK MCP essaie
|
|
21
|
+
* d'abord la forme avec chemin, puis retombe sur la racine devant un 4xx. La
|
|
22
|
+
* conformité repose alors sur le repli d'un client particulier — un client
|
|
23
|
+
* strict, ou une version qui resserre ce repli, ne trouve rien. C'est le même
|
|
24
|
+
* raisonnement que pour la découverte du serveur d'autorisation : le document
|
|
25
|
+
* que lit un client fidèle à la spécification ne doit pas être celui qui manque.
|
|
26
|
+
*
|
|
27
|
+
* Les deux emplacements sont servis, le plus spécifique en premier : monté par
|
|
28
|
+
* préfixe, un handler posé sur la racine capterait le chemin sans savoir y
|
|
29
|
+
* répondre.
|
|
30
|
+
*/
|
|
31
|
+
export function cheminsMetadonnees(resource) {
|
|
32
|
+
let chemin;
|
|
33
|
+
try {
|
|
34
|
+
chemin = new URL(resource).pathname.replace(/\/$/, "");
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Une ressource illisible ne doit pas empêcher de servir le document : la
|
|
38
|
+
// racine reste, et le contrôle d'audience refusera de toute façon.
|
|
39
|
+
return [CHEMIN_METADONNEES];
|
|
40
|
+
}
|
|
41
|
+
return chemin
|
|
42
|
+
? [`${CHEMIN_METADONNEES}${chemin}`, CHEMIN_METADONNEES]
|
|
43
|
+
: [CHEMIN_METADONNEES];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* URL absolue du document, telle qu'on l'annonce dans `WWW-Authenticate`.
|
|
47
|
+
*
|
|
48
|
+
* Dérivée de la ressource, et non fabriquée en retirant un suffixe supposé :
|
|
49
|
+
* un serveur monté ailleurs que sur `/mcp` recevait sinon une adresse fausse
|
|
50
|
+
* dans le seul en-tête qui dise au client où aller s'authentifier.
|
|
51
|
+
*/
|
|
52
|
+
export function urlMetadonnees(resource) {
|
|
53
|
+
try {
|
|
54
|
+
const { origin } = new URL(resource);
|
|
55
|
+
return `${origin}${cheminsMetadonnees(resource)[0]}`;
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return CHEMIN_METADONNEES;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
12
61
|
//# sourceMappingURL=metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/resource/metadata.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,oBAAoB,CAClC,IAAwB;IAExB,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,qBAAqB,EAAE,IAAI,CAAC,oBAAoB;QAChD,gBAAgB,EAAE,IAAI,CAAC,eAAe;QACtC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;QACpC,aAAa,EAAE,IAAI,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/resource/metadata.ts"],"names":[],"mappings":"AAqBA,MAAM,UAAU,oBAAoB,CAClC,IAAwB;IAExB,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,qBAAqB,EAAE,IAAI,CAAC,oBAAoB;QAChD,gBAAgB,EAAE,IAAI,CAAC,eAAe;QACtC,wBAAwB,EAAE,CAAC,QAAQ,CAAC;QACpC,aAAa,EAAE,IAAI,CAAC,YAAY;KACjC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,kBAAkB,GAAG,uCAAuC,CAAC;AAE1E;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,0EAA0E;QAC1E,mEAAmE;QACnE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM;QACX,CAAC,CAAC,CAAC,GAAG,kBAAkB,GAAG,MAAM,EAAE,EAAE,kBAAkB,CAAC;QACxD,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC3B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,OAAO,GAAG,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAC;IAC5B,CAAC;AACH,CAAC"}
|
package/dist/safety/target.d.ts
CHANGED
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
export interface Target {
|
|
2
2
|
url: string;
|
|
3
3
|
host: string;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Vise-t-on la production ? **Facultatif, et l'absence a un sens** : elle
|
|
6
|
+
* dit qu'on ne sait pas, ce qui n'est pas la même chose que « non ».
|
|
7
|
+
*
|
|
8
|
+
* `resolveTarget` tranche à partir de l'hôte, ce qui vaut pour un serveur
|
|
9
|
+
* local. En transport http la question n'a pas de réponse fiable : la cible
|
|
10
|
+
* est atteinte par un nom de service interne, identique en développement et
|
|
11
|
+
* en production. Y répondre `false` par défaut publiait « is_prod: false »
|
|
12
|
+
* au-dessus de comptes réels — constaté en recette. Un exploitant lit ce
|
|
13
|
+
* champ comme une réponse à « suis-je en production ? », et s'y fie.
|
|
14
|
+
*/
|
|
15
|
+
isProd?: boolean;
|
|
5
16
|
}
|
|
6
17
|
/** Le mot de passe est volontairement long et non devinable : on ne le pose pas
|
|
7
18
|
* par distraction, contrairement à `true` ou `1`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/safety/target.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../src/safety/target.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;sDACsD;AACtD,eAAO,MAAM,SAAS,eAAe,CAAC;AAEtC,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,oBAAoB;CAClC;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAqBnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/safety/target.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,gFAAgF;AAChF,6EAA6E;AAC7E,iEAAiE;AAEjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,WAAW;IACX,WAAW;IACX,KAAK;IACL,OAAO;IACP,SAAS;CACV,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"target.js","sourceRoot":"","sources":["../../src/safety/target.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,gFAAgF;AAChF,6EAA6E;AAC7E,iEAAiE;AAEjE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,WAAW;IACX,WAAW;IACX,KAAK;IACL,OAAO;IACP,SAAS;CACV,CAAC,CAAC;AAmBH;sDACsD;AACtD,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;AAEtC,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,IAAI,GAAG,gBAAgB,CAAC;CAClC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAa;IACzD,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAC1B,wBAAwB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACjD,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC1B,MAAM,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,IAAI,kBAAkB,CAC1B,qBAAqB,IAAI,0CAA0C;YACjE,wBAAwB,SAAS,mCAAmC,CACvE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,KAC3B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,WAAW,GAAG,gBAAgB,CAAC;CACrC;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"createMcpServer.d.ts","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAC7B,QAAQ,EAAE,QAAQ,GAAG,SAAS,KAC3B,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,WAAW,GAAG,gBAAgB,CAAC;CACrC;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,SAAS,CAoFpE"}
|
|
@@ -18,7 +18,7 @@ export function createMcpServer(opts) {
|
|
|
18
18
|
throw new Error(`Outil déclaré deux fois : ${tool.name}`);
|
|
19
19
|
}
|
|
20
20
|
noms.add(tool.name);
|
|
21
|
-
const description = ctx?.target.isProd && tool.requiresWrite
|
|
21
|
+
const description = ctx?.target.isProd === true && tool.requiresWrite
|
|
22
22
|
? PREFIXE_PROD + tool.description
|
|
23
23
|
: tool.description;
|
|
24
24
|
server.registerTool(tool.name, {
|
|
@@ -53,7 +53,11 @@ export function createMcpServer(opts) {
|
|
|
53
53
|
return ok({
|
|
54
54
|
...resultat,
|
|
55
55
|
target: contexte.target.url,
|
|
56
|
-
|
|
56
|
+
// Omis quand la cible ne sait pas : mieux vaut ne rien dire que
|
|
57
|
+
// répondre « non » à côté de données de production.
|
|
58
|
+
...(contexte.target.isProd === undefined
|
|
59
|
+
? {}
|
|
60
|
+
: { is_prod: contexte.target.isProd }),
|
|
57
61
|
});
|
|
58
62
|
}
|
|
59
63
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMcpServer.js","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAsBxD;gEACgE;AAChE,MAAM,YAAY,GAAG,eAAe,CAAC;AAErC,MAAM,UAAU,eAAe,CAAC,IAAyB;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAEzE,MAAM,gBAAgB,GAAG,KAAK,EAC5B,QAA8B,EACR,EAAE,CACxB,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAEjE,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,KAAK,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAElE,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEpB,MAAM,WAAW,GACf,GAAG,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"createMcpServer.js","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import type { Server } from
|
|
2
|
-
import type { McpServer } from
|
|
3
|
-
import type { OAuthTokenVerifier } from
|
|
4
|
-
import type { Logger } from
|
|
5
|
-
import type { OptionsMetadonnees } from
|
|
6
|
-
export type TransportKind =
|
|
1
|
+
import type { Server } from "node:http";
|
|
2
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import type { OAuthTokenVerifier } from "@modelcontextprotocol/sdk/server/auth/provider.js";
|
|
4
|
+
import type { Logger } from "../logger.js";
|
|
5
|
+
import type { OptionsMetadonnees } from "../resource/metadata.js";
|
|
6
|
+
export type TransportKind = "stdio" | "http";
|
|
7
7
|
export interface StartOptions {
|
|
8
8
|
transport?: TransportKind;
|
|
9
9
|
port?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIzE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAO3C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,kBAAkB,CAAC;QAC7B,2EAA2E;QAC3E,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,QAAQ,EAAE,kBAAkB,CAAC;KAC9B,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,EACtC,IAAI,GAAE,YAAiB,GACtB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAqF7B"}
|
package/dist/server/transport.js
CHANGED
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Deux transports pour un même serveur, choisis par variable d'environnement :
|
|
3
3
|
// `stdio` pour un client comme Claude Code, `http` pour le débogage manuel et un
|
|
4
4
|
// éventuel déploiement multi-client. Gabarit repris de kalifa.
|
|
5
|
-
import express from
|
|
6
|
-
import { StdioServerTransport } from
|
|
7
|
-
import { StreamableHTTPServerTransport } from
|
|
8
|
-
import { metadataHandler } from
|
|
9
|
-
import { requireBearerAuth } from
|
|
10
|
-
import { silentLogger } from
|
|
11
|
-
import {
|
|
5
|
+
import express from "express";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
8
|
+
import { metadataHandler } from "@modelcontextprotocol/sdk/server/auth/handlers/metadata.js";
|
|
9
|
+
import { requireBearerAuth } from "@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js";
|
|
10
|
+
import { silentLogger } from "../logger.js";
|
|
11
|
+
import { cheminsMetadonnees, metadonneesRessource, urlMetadonnees, } from "../resource/metadata.js";
|
|
12
12
|
/**
|
|
13
13
|
* Démarre le transport et rend le serveur HTTP, quand il y en a un.
|
|
14
14
|
*
|
|
@@ -17,15 +17,15 @@ import { CHEMIN_METADONNEES, metadonneesRessource } from '../resource/metadata.j
|
|
|
17
17
|
*/
|
|
18
18
|
export async function startTransport(serveur, opts = {}) {
|
|
19
19
|
const logger = opts.logger ?? silentLogger;
|
|
20
|
-
const kind = opts.transport ??
|
|
21
|
-
if (kind ===
|
|
22
|
-
const server = typeof serveur ===
|
|
20
|
+
const kind = opts.transport ?? "stdio";
|
|
21
|
+
if (kind === "stdio") {
|
|
22
|
+
const server = typeof serveur === "function" ? serveur() : serveur;
|
|
23
23
|
await server.connect(new StdioServerTransport());
|
|
24
|
-
logger.info(
|
|
24
|
+
logger.info("transport stdio prêt");
|
|
25
25
|
return undefined;
|
|
26
26
|
}
|
|
27
27
|
const app = express();
|
|
28
|
-
app.use(express.json({ limit:
|
|
28
|
+
app.use(express.json({ limit: "4mb" }));
|
|
29
29
|
const protection = opts.resourceServer;
|
|
30
30
|
if (protection) {
|
|
31
31
|
// Le document de découverte reste PUBLIC : c'est par lui qu'un client non
|
|
@@ -35,8 +35,12 @@ export async function startTransport(serveur, opts = {}) {
|
|
|
35
35
|
// Monté en `get`, la requête lui parvient avec son chemin entier, sa route
|
|
36
36
|
// ne correspond jamais, et le document répond 404 — en désignant pourtant
|
|
37
37
|
// sa propre adresse dans l'en-tête `WWW-Authenticate` des refus.
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
const document = metadonneesRessource(protection.metadata);
|
|
39
|
+
const chemins = cheminsMetadonnees(protection.metadata.resource);
|
|
40
|
+
for (const chemin of chemins) {
|
|
41
|
+
app.use(chemin, metadataHandler(document));
|
|
42
|
+
}
|
|
43
|
+
logger.info(`métadonnées de ressource sur ${chemins.join(" et ")}`);
|
|
40
44
|
}
|
|
41
45
|
// Mode SANS ÉTAT : `sessionIdGenerator: undefined`. Aucune session n'est tenue
|
|
42
46
|
// côté serveur, donc rien à répliquer si l'on déploie plusieurs instances.
|
|
@@ -45,7 +49,7 @@ export async function startTransport(serveur, opts = {}) {
|
|
|
45
49
|
// entre requêtes. Un transport unique accepte la première initialisation puis
|
|
46
50
|
// rejette tout le reste en 500, sans message. Il faut donc en créer un — et un
|
|
47
51
|
// serveur — par requête, puis les refermer.
|
|
48
|
-
const fabriqueServeur = typeof serveur ===
|
|
52
|
+
const fabriqueServeur = typeof serveur === "function" ? serveur : () => serveur;
|
|
49
53
|
const relais = async (req, res) => {
|
|
50
54
|
const instance = fabriqueServeur();
|
|
51
55
|
const transport = new StreamableHTTPServerTransport({
|
|
@@ -53,7 +57,7 @@ export async function startTransport(serveur, opts = {}) {
|
|
|
53
57
|
});
|
|
54
58
|
// Refermer sur la fin de la réponse : sans cela chaque requête laisserait
|
|
55
59
|
// un serveur et un transport derrière elle.
|
|
56
|
-
res.on(
|
|
60
|
+
res.on("close", () => {
|
|
57
61
|
void transport.close();
|
|
58
62
|
void instance.close();
|
|
59
63
|
});
|
|
@@ -69,13 +73,13 @@ export async function startTransport(serveur, opts = {}) {
|
|
|
69
73
|
requireBearerAuth({
|
|
70
74
|
verifier: protection.verifier,
|
|
71
75
|
requiredScopes: protection.requiredScopes,
|
|
72
|
-
resourceMetadataUrl:
|
|
76
|
+
resourceMetadataUrl: urlMetadonnees(protection.metadata.resource),
|
|
73
77
|
}),
|
|
74
78
|
]
|
|
75
79
|
: [];
|
|
76
|
-
app.post(
|
|
77
|
-
app.get(
|
|
78
|
-
app.delete(
|
|
80
|
+
app.post("/mcp", ...garde, relais);
|
|
81
|
+
app.get("/mcp", ...garde, relais);
|
|
82
|
+
app.delete("/mcp", ...garde, relais);
|
|
79
83
|
const port = opts.port ?? 3000;
|
|
80
84
|
return new Promise((resolve) => {
|
|
81
85
|
const httpServer = app.listen(port, () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"AAAA,0BAA0B;AAC1B,+EAA+E;AAC/E,iFAAiF;AACjF,+DAA+D;AAC/D,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAGnG,OAAO,EAAE,eAAe,EAAE,MAAM,4DAA4D,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,MAAM,gEAAgE,CAAC;AAInG,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@happykiller/sunny-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.5",
|
|
4
4
|
"description": "Socle MCP partagé : transport, session GraphQL, registre d'outils et garde-fous, pour exposer le back-office d'un produit aux agents.",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"repository": {
|