@happykiller/sunny-mcp 0.2.4 → 0.2.6

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,4 +1,4 @@
1
- import type { OAuthProtectedResourceMetadata } from '@modelcontextprotocol/sdk/shared/auth.js';
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;
@@ -3,12 +3,12 @@ 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: ['header'],
6
+ bearer_methods_supported: ["header"],
7
7
  resource_name: opts.resourceName,
8
8
  };
9
9
  }
10
10
  /** Racine du document. Emplacement normatif d'une ressource SANS chemin. */
11
- export const CHEMIN_METADONNEES = '/.well-known/oauth-protected-resource';
11
+ export const CHEMIN_METADONNEES = "/.well-known/oauth-protected-resource";
12
12
  /**
13
13
  * Où servir le document, pour une ressource donnée.
14
14
  *
@@ -31,7 +31,7 @@ export const CHEMIN_METADONNEES = '/.well-known/oauth-protected-resource';
31
31
  export function cheminsMetadonnees(resource) {
32
32
  let chemin;
33
33
  try {
34
- chemin = new URL(resource).pathname.replace(/\/$/, '');
34
+ chemin = new URL(resource).pathname.replace(/\/$/, "");
35
35
  }
36
36
  catch {
37
37
  // Une ressource illisible ne doit pas empêcher de servir le document : la
@@ -1,7 +1,18 @@
1
1
  export interface Target {
2
2
  url: string;
3
3
  host: string;
4
- isProd: boolean;
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;CACjB;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
+ {"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"}
@@ -3,17 +3,17 @@
3
3
  // refuse d'écrire sans `--write`. Il ne protège pas contre un attaquant — il
4
4
  // protège contre soi-même, un soir où l'on croit viser le local.
5
5
  const HOTES_LOCAUX = new Set([
6
- 'localhost',
7
- '127.0.0.1',
8
- '::1',
9
- '[::1]',
10
- '0.0.0.0',
6
+ "localhost",
7
+ "127.0.0.1",
8
+ "::1",
9
+ "[::1]",
10
+ "0.0.0.0",
11
11
  ]);
12
12
  /** Le mot de passe est volontairement long et non devinable : on ne le pose pas
13
13
  * par distraction, contrairement à `true` ou `1`. */
14
- export const AVEU_PROD = 'yes-i-know';
14
+ export const AVEU_PROD = "yes-i-know";
15
15
  export class TargetRefusedError extends Error {
16
- code = 'TARGET_REFUSED';
16
+ code = "TARGET_REFUSED";
17
17
  }
18
18
  export function resolveTarget(rawUrl, aveu) {
19
19
  let url;
@@ -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;AAQH;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
+ {"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,5 +1,6 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- import type { Appelant, ToolCatalog, ToolContext } from '../tools/defineTool.js';
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { Appelant, ToolCatalog, ToolContext } from "../tools/defineTool.js";
3
+ import type { Target } from "../safety/target.js";
3
4
  /**
4
5
  * Contexte des outils : une valeur fixe, ou une fabrique appelée à CHAQUE
5
6
  * requête.
@@ -14,6 +15,16 @@ export interface CreateServerOptions {
14
15
  version: string;
15
16
  catalog: ToolCatalog;
16
17
  ctx: ToolContext | FabriqueContexte;
18
+ /**
19
+ * Cible visée, quand `ctx` est une FABRIQUE.
20
+ *
21
+ * Les descriptions sont figées à l'enregistrement, alors qu'une fabrique ne
22
+ * rend son contexte qu'à l'arrivée d'une requête : la cible était donc
23
+ * inconnue au moment de décider du préfixe, et les outils destructifs
24
+ * perdaient silencieusement leur avertissement `[PRODUCTION]` — sur le seul
25
+ * transport où plusieurs personnes agissent à distance. Constaté en recette.
26
+ */
27
+ target?: Target;
17
28
  }
18
29
  export declare function createMcpServer(opts: CreateServerOptions): McpServer;
19
30
  //# sourceMappingURL=createMcpServer.d.ts.map
@@ -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,CAgFpE"}
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,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD;;;;;;;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;IACpC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAMD,wBAAgB,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,SAAS,CAsFpE"}
@@ -1,24 +1,25 @@
1
1
  // src/server/createMcpServer.ts
2
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
- import { ok, fail } from './contract.js';
4
- import { GraphQLCallError } from '../graphql/errors.js';
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { ok, fail } from "./contract.js";
4
+ import { GraphQLCallError } from "../graphql/errors.js";
5
5
  /** Préfixe apposé en clair sur les outils écrivant en production : la seule
6
6
  * chose que l'agent lit avant d'agir, c'est la description. */
7
- const PREFIXE_PROD = '[PRODUCTION] ';
7
+ const PREFIXE_PROD = "[PRODUCTION] ";
8
8
  export function createMcpServer(opts) {
9
9
  const { catalog } = opts;
10
10
  const server = new McpServer({ name: opts.name, version: opts.version });
11
- const resoudreContexte = async (appelant) => typeof opts.ctx === 'function' ? opts.ctx(appelant) : opts.ctx;
12
- // La cible et l'interrupteur d'écriture ne dépendent pas de l'appelant : on
13
- // les lit une fois, pour décider des descriptions à l'enregistrement.
14
- const ctx = typeof opts.ctx === 'function' ? undefined : opts.ctx;
11
+ const resoudreContexte = async (appelant) => typeof opts.ctx === "function" ? opts.ctx(appelant) : opts.ctx;
12
+ // La cible ne dépend pas de l'appelant : on la lit une fois, pour décider des
13
+ // descriptions à l'enregistrement. Avec une fabrique, elle doit être fournie
14
+ // à part — sans quoi le préfixe ne serait jamais posé.
15
+ const cible = typeof opts.ctx === "function" ? opts.target : opts.target ?? opts.ctx.target;
15
16
  const noms = new Set();
16
17
  for (const tool of catalog) {
17
18
  if (noms.has(tool.name)) {
18
19
  throw new Error(`Outil déclaré deux fois : ${tool.name}`);
19
20
  }
20
21
  noms.add(tool.name);
21
- const description = ctx?.target.isProd && tool.requiresWrite
22
+ const description = cible?.isProd === true && tool.requiresWrite
22
23
  ? PREFIXE_PROD + tool.description
23
24
  : tool.description;
24
25
  server.registerTool(tool.name, {
@@ -40,10 +41,10 @@ export function createMcpServer(opts) {
40
41
  const contexte = await resoudreContexte(appelant);
41
42
  if (tool.requiresWrite && !contexte.allowWrites) {
42
43
  // Refus AVANT toute requête : rien ne part sur le réseau.
43
- return fail('WRITES_DISABLED', {
44
+ return fail("WRITES_DISABLED", {
44
45
  tool: tool.name,
45
46
  target: contexte.target.url,
46
- hint: 'Poser SUNNY_MCP_ALLOW_WRITES=true pour autoriser les écritures.',
47
+ hint: "Poser SUNNY_MCP_ALLOW_WRITES=true pour autoriser les écritures.",
47
48
  });
48
49
  }
49
50
  try {
@@ -53,7 +54,11 @@ export function createMcpServer(opts) {
53
54
  return ok({
54
55
  ...resultat,
55
56
  target: contexte.target.url,
56
- is_prod: contexte.target.isProd,
57
+ // Omis quand la cible ne sait pas : mieux vaut ne rien dire que
58
+ // répondre « non » à côté de données de production.
59
+ ...(contexte.target.isProd === undefined
60
+ ? {}
61
+ : { is_prod: contexte.target.isProd }),
57
62
  });
58
63
  }
59
64
  catch (e) {
@@ -61,7 +66,7 @@ export function createMcpServer(opts) {
61
66
  if (e instanceof GraphQLCallError) {
62
67
  return fail(e.code, { ...e.details, tool: tool.name });
63
68
  }
64
- return fail(e?.code ?? 'TOOL_FAILED', {
69
+ return fail(e?.code ?? "TOOL_FAILED", {
65
70
  message: e?.message ?? String(e),
66
71
  tool: tool.name,
67
72
  });
@@ -1 +1 @@
1
- {"version":3,"file":"createMcpServer.js","sourceRoot":"","sources":["../../src/server/createMcpServer.ts"],"names":[],"mappings":"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"}
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 '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';
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;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,CAsF7B"}
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"}
@@ -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 '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';
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 { cheminsMetadonnees, metadonneesRessource, urlMetadonnees, } from '../re
17
17
  */
18
18
  export async function startTransport(serveur, opts = {}) {
19
19
  const logger = opts.logger ?? silentLogger;
20
- const kind = opts.transport ?? 'stdio';
21
- if (kind === 'stdio') {
22
- const server = typeof serveur === 'function' ? serveur() : 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('transport stdio prêt');
24
+ logger.info("transport stdio prêt");
25
25
  return undefined;
26
26
  }
27
27
  const app = express();
28
- app.use(express.json({ limit: '4mb' }));
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
@@ -40,7 +40,7 @@ export async function startTransport(serveur, opts = {}) {
40
40
  for (const chemin of chemins) {
41
41
  app.use(chemin, metadataHandler(document));
42
42
  }
43
- logger.info(`métadonnées de ressource sur ${chemins.join(' et ')}`);
43
+ logger.info(`métadonnées de ressource sur ${chemins.join(" et ")}`);
44
44
  }
45
45
  // Mode SANS ÉTAT : `sessionIdGenerator: undefined`. Aucune session n'est tenue
46
46
  // côté serveur, donc rien à répliquer si l'on déploie plusieurs instances.
@@ -49,7 +49,7 @@ export async function startTransport(serveur, opts = {}) {
49
49
  // entre requêtes. Un transport unique accepte la première initialisation puis
50
50
  // rejette tout le reste en 500, sans message. Il faut donc en créer un — et un
51
51
  // serveur — par requête, puis les refermer.
52
- const fabriqueServeur = typeof serveur === 'function' ? serveur : () => serveur;
52
+ const fabriqueServeur = typeof serveur === "function" ? serveur : () => serveur;
53
53
  const relais = async (req, res) => {
54
54
  const instance = fabriqueServeur();
55
55
  const transport = new StreamableHTTPServerTransport({
@@ -57,7 +57,7 @@ export async function startTransport(serveur, opts = {}) {
57
57
  });
58
58
  // Refermer sur la fin de la réponse : sans cela chaque requête laisserait
59
59
  // un serveur et un transport derrière elle.
60
- res.on('close', () => {
60
+ res.on("close", () => {
61
61
  void transport.close();
62
62
  void instance.close();
63
63
  });
@@ -77,9 +77,9 @@ export async function startTransport(serveur, opts = {}) {
77
77
  }),
78
78
  ]
79
79
  : [];
80
- app.post('/mcp', ...garde, relais);
81
- app.get('/mcp', ...garde, relais);
82
- app.delete('/mcp', ...garde, relais);
80
+ app.post("/mcp", ...garde, relais);
81
+ app.get("/mcp", ...garde, relais);
82
+ app.delete("/mcp", ...garde, relais);
83
83
  const port = opts.port ?? 3000;
84
84
  return new Promise((resolve) => {
85
85
  const httpServer = app.listen(port, () => {
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/server/transport.ts"],"names":[],"mappings":"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"}
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.4",
3
+ "version": "0.2.6",
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": {