@happykiller/sunny-mcp 0.2.2 → 0.2.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAE5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,kBAAkB,CAiCpB"}
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AAG5F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,kBAAkB,CAiDpB"}
@@ -6,6 +6,7 @@
6
6
  // for them as the intended audience ». Sans ce contrôle, un jeton obtenu pour
7
7
  // n'importe quel autre service ouvrirait celui-ci.
8
8
  import { createRemoteJWKSet, jwtVerify } from 'jose';
9
+ import { InvalidTokenError } from '@modelcontextprotocol/sdk/server/auth/errors.js';
9
10
  import { silentLogger } from '../logger.js';
10
11
  /**
11
12
  * Vérificateur adossé au JWKS du serveur d'autorisation.
@@ -20,12 +21,28 @@ export function creerVerificateurJwks(opts) {
20
21
  const jwks = createRemoteJWKSet(new URL(opts.jwksUri));
21
22
  return {
22
23
  async verifyAccessToken(token) {
23
- const { payload } = await jwtVerify(token, jwks, {
24
- issuer: opts.issuer,
25
- // C'est LE contrôle qui compte. `jose` rejette le jeton si son `aud` ne
26
- // contient pas cette valeur — donc si le jeton était destiné ailleurs.
27
- audience: opts.resource,
28
- });
24
+ // `jose` signale tout échec par une exception qui lui est propre :
25
+ // signature invalide, jeton illisible, expiration, audience étrangère.
26
+ // Le middleware du SDK ne sait traduire qu'`InvalidTokenError` en 401 ;
27
+ // toute autre exception ressort en 500, SANS en-tête `WWW-Authenticate`.
28
+ // La nuance n'est pas cosmétique : un client qui reçoit 500 conclut à une
29
+ // panne du serveur, là où un 401 lui dit de refaire son autorisation. Un
30
+ // jeton simplement expiré condamnerait donc la session au lieu de la
31
+ // renouveler.
32
+ let payload;
33
+ try {
34
+ ({ payload } = await jwtVerify(token, jwks, {
35
+ issuer: opts.issuer,
36
+ // C'est LE contrôle qui compte. `jose` rejette le jeton si son `aud`
37
+ // ne contient pas cette valeur — donc s'il était destiné ailleurs.
38
+ audience: opts.resource,
39
+ }));
40
+ }
41
+ catch (erreur) {
42
+ const motif = erreur instanceof Error ? erreur.message : 'jeton invalide';
43
+ logger.info(`jeton refusé — ${motif}`);
44
+ throw new InvalidTokenError(motif);
45
+ }
29
46
  const scopes = String(payload.scope ?? '')
30
47
  .split(' ')
31
48
  .filter(Boolean);
@@ -1 +1 @@
1
- {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,oDAAoD;AACpD,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAKrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAY5C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAEvD,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,KAAa;YACnC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;gBAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,wEAAwE;gBACxE,uEAAuE;gBACvE,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;iBACvC,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,MAAM,CAAC,IAAI,CACT,uBAAuB,OAAO,CAAC,GAAG,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAC3E,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;gBACxD,MAAM;gBACN,SAAS,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBACpE,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChC,qEAAqE;gBACrE,iEAAiE;gBACjE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/resource/verifier.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B,oDAAoD;AACpD,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,mDAAmD;AACnD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iDAAiD,CAAC;AAGpF,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAY5C;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAyB;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,YAAY,CAAC;IAC3C,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAEvD,OAAO;QACL,KAAK,CAAC,iBAAiB,CAAC,KAAa;YACnC,mEAAmE;YACnE,uEAAuE;YACvE,wEAAwE;YACxE,yEAAyE;YACzE,0EAA0E;YAC1E,yEAAyE;YACzE,qEAAqE;YACrE,cAAc;YACd,IAAI,OAAO,CAAC;YACZ,IAAI,CAAC;gBACH,CAAC,EAAE,OAAO,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;oBAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,qEAAqE;oBACrE,mEAAmE;oBACnE,QAAQ,EAAE,IAAI,CAAC,QAAQ;iBACxB,CAAC,CAAC,CAAC;YACN,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,KAAK,GACT,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC;gBAC9D,MAAM,CAAC,IAAI,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;gBACvC,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;iBACvC,KAAK,CAAC,GAAG,CAAC;iBACV,MAAM,CAAC,OAAO,CAAC,CAAC;YAEnB,MAAM,CAAC,IAAI,CACT,uBAAuB,OAAO,CAAC,GAAG,WAAW,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAC3E,CAAC;YAEF,OAAO;gBACL,KAAK;gBACL,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC;gBACxD,MAAM;gBACN,SAAS,EAAE,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;gBACpE,QAAQ,EAAE,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAChC,qEAAqE;gBACrE,iEAAiE;gBACjE,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happykiller/sunny-mcp",
3
- "version": "0.2.2",
3
+ "version": "0.2.3",
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": {