@intlayer/mcp 6.1.6 → 7.0.0-canary.1

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.
Files changed (45) hide show
  1. package/dist/cjs/_virtual/rolldown_runtime.cjs +25 -0
  2. package/dist/cjs/client/client.cjs +22 -42
  3. package/dist/cjs/client/client.cjs.map +1 -1
  4. package/dist/cjs/client/sse.cjs +59 -57
  5. package/dist/cjs/client/sse.cjs.map +1 -1
  6. package/dist/cjs/server/server.cjs +29 -53
  7. package/dist/cjs/server/server.cjs.map +1 -1
  8. package/dist/cjs/server/sse.cjs +92 -104
  9. package/dist/cjs/server/sse.cjs.map +1 -1
  10. package/dist/cjs/server/stdio.cjs +14 -9
  11. package/dist/cjs/server/stdio.cjs.map +1 -1
  12. package/dist/cjs/tools/cli.cjs +203 -268
  13. package/dist/cjs/tools/cli.cjs.map +1 -1
  14. package/dist/cjs/tools/docs.cjs +34 -145
  15. package/dist/cjs/tools/docs.cjs.map +1 -1
  16. package/dist/esm/client/client.mjs +12 -13
  17. package/dist/esm/client/client.mjs.map +1 -1
  18. package/dist/esm/client/sse.mjs +55 -55
  19. package/dist/esm/client/sse.mjs.map +1 -1
  20. package/dist/esm/server/server.mjs +20 -25
  21. package/dist/esm/server/server.mjs.map +1 -1
  22. package/dist/esm/server/sse.mjs +81 -74
  23. package/dist/esm/server/sse.mjs.map +1 -1
  24. package/dist/esm/server/stdio.mjs +10 -6
  25. package/dist/esm/server/stdio.mjs.map +1 -1
  26. package/dist/esm/tools/cli.mjs +199 -240
  27. package/dist/esm/tools/cli.mjs.map +1 -1
  28. package/dist/esm/tools/docs.mjs +31 -111
  29. package/dist/esm/tools/docs.mjs.map +1 -1
  30. package/dist/types/client/client.d.ts +8 -25
  31. package/dist/types/client/client.d.ts.map +1 -1
  32. package/dist/types/client/sse.d.ts +1 -2
  33. package/dist/types/server/server.d.ts +8 -3
  34. package/dist/types/server/server.d.ts.map +1 -1
  35. package/dist/types/server/sse.d.ts +1 -3
  36. package/dist/types/server/stdio.d.ts +1 -3
  37. package/dist/types/tools/cli.d.ts +7 -2
  38. package/dist/types/tools/cli.d.ts.map +1 -1
  39. package/dist/types/tools/docs.d.ts +7 -2
  40. package/dist/types/tools/docs.d.ts.map +1 -1
  41. package/package.json +47 -53
  42. package/LICENSE +0 -202
  43. package/dist/types/client/sse.d.ts.map +0 -1
  44. package/dist/types/server/sse.d.ts.map +0 -1
  45. package/dist/types/server/stdio.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport dotenv from 'dotenv';\nimport express, { type Request, type Response } from 'express';\nimport { loadServer } from './server';\n\n/*******************************/\n/******* Server Set Up *******/\n/*******************************/\n\nconst server = loadServer(false);\n\n/*******************************/\n/******* Express App Set Up *******/\n/*******************************/\n\nconst app = express();\n\n// Environment variables\nconst env = app.get('env');\n\ndotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n});\n\n// Enable CORS for development\napp.use((req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.sendStatus(200);\n return;\n }\n\n next();\n});\n\napp.use(express.json());\nconst router = express.Router();\n\n// to support multiple simultaneous connections we have a lookup object from\n// sessionId to transport\nconst transports: { [sessionId: string]: SSEServerTransport } = {};\n\n// endpoint for the client to use for sending messages\nconst POST_ENDPOINT = '/messages';\n\nrouter.post(POST_ENDPOINT, async (req: Request, res: Response) => {\n console.info('message request received: ', req.body);\n // when client sends messages with `SSEClientTransport`,\n // the sessionId will be atomically set as query parameter.\n const sessionId = req.query.sessionId;\n\n if (typeof sessionId != 'string') {\n res.status(400).send({ messages: 'Bad session id.' });\n return;\n }\n const transport = transports[sessionId];\n if (!transport) {\n res.status(400).send({ messages: 'No transport found for sessionId.' });\n return;\n }\n\n // IMPORTANT!\n // using `await transport.handlePostMessage(req, res)` will cause\n // `SSE transport error: Error: Error POSTing to endpoint (HTTP 400): InternalServerError: stream is not readable`\n // on the client side\n await transport.handlePostMessage(req, res, req.body);\n\n return;\n});\n\n// initialization:\n// create a new transport to connect and\n// send an endpoint event containing a URI for the client to use for sending messages\nrouter.get('/', async (_req: Request, res: Response) => {\n console.info('connection request received');\n // tells the client to send messages to the `POST_ENDPOINT`\n const transport = new SSEServerTransport(POST_ENDPOINT, res);\n console.info('new transport created with session id: ', transport.sessionId);\n\n transports[transport.sessionId] = transport;\n\n console.info(`${Object.keys(transports).length} sessions active`);\n\n res.on('close', () => {\n console.info('SSE connection closed');\n delete transports[transport.sessionId];\n });\n\n await server.connect(transport);\n\n // an exmaple of a server-sent-event (message) to client\n await sendMessages(transport);\n\n return;\n});\n\nconst sendMessages = async (transport: SSEServerTransport) => {\n try {\n // some messages will proabaly not be able to observed on the client side\n // becasue an open SSE Stream is not yet established\n // by receving the `initialize` POST request and the `notifications/initialized` POST request\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/connection',\n params: { message: 'Stream started' },\n });\n console.info('Stream started');\n\n let messageCount = 0;\n const interval = setInterval(async () => {\n messageCount++;\n\n const message = `Message ${messageCount} at ${new Date().toISOString()}`;\n\n try {\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/message',\n params: { data: message },\n });\n\n console.info(`Sent: ${message}`);\n\n if (messageCount === 2) {\n clearInterval(interval);\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/complete',\n params: { message: 'Stream completed' },\n });\n console.info('Stream completed');\n }\n } catch (error) {\n console.error('Error sending message:', error);\n clearInterval(interval);\n }\n }, 1000);\n } catch (error) {\n console.error('Error in startSending:', error);\n }\n};\n\napp.use('/', router);\n\napp.use('/health', (_req: Request, res: Response) => {\n res.send('OK');\n});\n\nconst PORT = process.env.PORT ?? 3000;\n\napp.listen(PORT, () => {\n console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);\n});\n"],"mappings":";AAEA,SAAS,0BAA0B;AACnC,OAAO,YAAY;AACnB,OAAO,aAA8C;AACrD,SAAS,kBAAkB;AAM3B,MAAM,SAAS,WAAW,KAAK;AAM/B,MAAM,MAAM,QAAQ;AAGpB,MAAM,MAAM,IAAI,IAAI,KAAK;AAEzB,OAAO,OAAO;AAAA,EACZ,MAAM,CAAC,QAAQ,GAAG,UAAU,QAAQ,GAAG,IAAI,cAAc,MAAM;AACjE,CAAC;AAGD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;AAC1B,MAAI,OAAO,+BAA+B,GAAG;AAC7C,MAAI,OAAO,gCAAgC,oBAAoB;AAC/D,MAAI,OAAO,gCAAgC,cAAc;AAEzD,MAAI,IAAI,WAAW,WAAW;AAC5B,QAAI,WAAW,GAAG;AAClB;AAAA,EACF;AAEA,OAAK;AACP,CAAC;AAED,IAAI,IAAI,QAAQ,KAAK,CAAC;AACtB,MAAM,SAAS,QAAQ,OAAO;AAI9B,MAAM,aAA0D,CAAC;AAGjE,MAAM,gBAAgB;AAEtB,OAAO,KAAK,eAAe,OAAO,KAAc,QAAkB;AAChE,UAAQ,KAAK,8BAA8B,IAAI,IAAI;AAGnD,QAAM,YAAY,IAAI,MAAM;AAE5B,MAAI,OAAO,aAAa,UAAU;AAChC,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,kBAAkB,CAAC;AACpD;AAAA,EACF;AACA,QAAM,YAAY,WAAW,SAAS;AACtC,MAAI,CAAC,WAAW;AACd,QAAI,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,oCAAoC,CAAC;AACtE;AAAA,EACF;AAMA,QAAM,UAAU,kBAAkB,KAAK,KAAK,IAAI,IAAI;AAEpD;AACF,CAAC;AAKD,OAAO,IAAI,KAAK,OAAO,MAAe,QAAkB;AACtD,UAAQ,KAAK,6BAA6B;AAE1C,QAAM,YAAY,IAAI,mBAAmB,eAAe,GAAG;AAC3D,UAAQ,KAAK,2CAA2C,UAAU,SAAS;AAE3E,aAAW,UAAU,SAAS,IAAI;AAElC,UAAQ,KAAK,GAAG,OAAO,KAAK,UAAU,EAAE,MAAM,kBAAkB;AAEhE,MAAI,GAAG,SAAS,MAAM;AACpB,YAAQ,KAAK,uBAAuB;AACpC,WAAO,WAAW,UAAU,SAAS;AAAA,EACvC,CAAC;AAED,QAAM,OAAO,QAAQ,SAAS;AAG9B,QAAM,aAAa,SAAS;AAE5B;AACF,CAAC;AAED,MAAM,eAAe,OAAO,cAAkC;AAC5D,MAAI;AAIF,UAAM,UAAU,KAAK;AAAA,MACnB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ,EAAE,SAAS,iBAAiB;AAAA,IACtC,CAAC;AACD,YAAQ,KAAK,gBAAgB;AAE7B,QAAI,eAAe;AACnB,UAAM,WAAW,YAAY,YAAY;AACvC;AAEA,YAAM,UAAU,WAAW,YAAY,QAAO,oBAAI,KAAK,GAAE,YAAY,CAAC;AAEtE,UAAI;AACF,cAAM,UAAU,KAAK;AAAA,UACnB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,MAAM,QAAQ;AAAA,QAC1B,CAAC;AAED,gBAAQ,KAAK,SAAS,OAAO,EAAE;AAE/B,YAAI,iBAAiB,GAAG;AACtB,wBAAc,QAAQ;AACtB,gBAAM,UAAU,KAAK;AAAA,YACnB,SAAS;AAAA,YACT,QAAQ;AAAA,YACR,QAAQ,EAAE,SAAS,mBAAmB;AAAA,UACxC,CAAC;AACD,kBAAQ,KAAK,kBAAkB;AAAA,QACjC;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,0BAA0B,KAAK;AAC7C,sBAAc,QAAQ;AAAA,MACxB;AAAA,IACF,GAAG,GAAI;AAAA,EACT,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAAA,EAC/C;AACF;AAEA,IAAI,IAAI,KAAK,MAAM;AAEnB,IAAI,IAAI,WAAW,CAAC,MAAe,QAAkB;AACnD,MAAI,KAAK,IAAI;AACf,CAAC;AAED,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,IAAI,OAAO,MAAM,MAAM;AACrB,UAAQ,KAAK,gDAAgD,IAAI,EAAE;AACrE,CAAC;","names":[]}
1
+ {"version":3,"file":"sse.mjs","names":["transports: { [sessionId: string]: SSEServerTransport }"],"sources":["../../../src/server/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';\nimport dotenv from 'dotenv';\nimport express, { type Request, type Response } from 'express';\nimport { loadServer } from './server';\n\n/*******************************/\n/******* Server Set Up *******/\n/*******************************/\n\nconst server = loadServer(false);\n\n/*******************************/\n/******* Express App Set Up *******/\n/*******************************/\n\nconst app = express();\n\n// Environment variables\nconst env = app.get('env');\n\ndotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n});\n\n// Enable CORS for development\napp.use((req, res, next) => {\n res.header('Access-Control-Allow-Origin', '*');\n res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');\n res.header('Access-Control-Allow-Headers', 'Content-Type');\n\n if (req.method === 'OPTIONS') {\n res.sendStatus(200);\n return;\n }\n\n next();\n});\n\napp.use(express.json());\nconst router = express.Router();\n\n// to support multiple simultaneous connections we have a lookup object from\n// sessionId to transport\nconst transports: { [sessionId: string]: SSEServerTransport } = {};\n\n// endpoint for the client to use for sending messages\nconst POST_ENDPOINT = '/messages';\n\nrouter.post(POST_ENDPOINT, async (req: Request, res: Response) => {\n console.info('message request received: ', req.body);\n // when client sends messages with `SSEClientTransport`,\n // the sessionId will be atomically set as query parameter.\n const sessionId = req.query.sessionId;\n\n if (typeof sessionId !== 'string') {\n res.status(400).send({ messages: 'Bad session id.' });\n return;\n }\n const transport = transports[sessionId];\n if (!transport) {\n res.status(400).send({ messages: 'No transport found for sessionId.' });\n return;\n }\n\n // IMPORTANT!\n // using `await transport.handlePostMessage(req, res)` will cause\n // `SSE transport error: Error: Error POSTing to endpoint (HTTP 400): InternalServerError: stream is not readable`\n // on the client side\n await transport.handlePostMessage(req, res, req.body);\n\n return;\n});\n\n// initialization:\n// create a new transport to connect and\n// send an endpoint event containing a URI for the client to use for sending messages\nrouter.get('/', async (_req: Request, res: Response) => {\n console.info('connection request received');\n // tells the client to send messages to the `POST_ENDPOINT`\n const transport = new SSEServerTransport(POST_ENDPOINT, res);\n console.info('new transport created with session id: ', transport.sessionId);\n\n transports[transport.sessionId] = transport;\n\n console.info(`${Object.keys(transports).length} sessions active`);\n\n res.on('close', () => {\n console.info('SSE connection closed');\n delete transports[transport.sessionId];\n });\n\n await server.connect(transport);\n\n // an exmaple of a server-sent-event (message) to client\n await sendMessages(transport);\n\n return;\n});\n\nconst sendMessages = async (transport: SSEServerTransport) => {\n try {\n // some messages will proabaly not be able to observed on the client side\n // becasue an open SSE Stream is not yet established\n // by receving the `initialize` POST request and the `notifications/initialized` POST request\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/connection',\n params: { message: 'Stream started' },\n });\n console.info('Stream started');\n\n let messageCount = 0;\n const interval = setInterval(async () => {\n messageCount++;\n\n const message = `Message ${messageCount} at ${new Date().toISOString()}`;\n\n try {\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/message',\n params: { data: message },\n });\n\n console.info(`Sent: ${message}`);\n\n if (messageCount === 2) {\n clearInterval(interval);\n await transport.send({\n jsonrpc: '2.0',\n method: 'sse/complete',\n params: { message: 'Stream completed' },\n });\n console.info('Stream completed');\n }\n } catch (error) {\n console.error('Error sending message:', error);\n clearInterval(interval);\n }\n }, 1000);\n } catch (error) {\n console.error('Error in startSending:', error);\n }\n};\n\napp.use('/', router);\n\napp.use('/health', (_req: Request, res: Response) => {\n res.send('OK');\n});\n\nconst PORT = process.env.PORT ?? 3000;\n\napp.listen(PORT, () => {\n console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);\n});\n"],"mappings":";;;;;;;;AAWA,MAAM,SAAS,WAAW,MAAM;;AAMhC,MAAM,MAAM,SAAS;AAGrB,MAAM,MAAM,IAAI,IAAI,MAAM;AAE1B,OAAO,OAAO,EACZ,MAAM;CAAC,QAAQ,IAAI;CAAS,QAAQ;CAAO;CAAc;CAAO,EACjE,CAAC;AAGF,IAAI,KAAK,KAAK,KAAK,SAAS;AAC1B,KAAI,OAAO,+BAA+B,IAAI;AAC9C,KAAI,OAAO,gCAAgC,qBAAqB;AAChE,KAAI,OAAO,gCAAgC,eAAe;AAE1D,KAAI,IAAI,WAAW,WAAW;AAC5B,MAAI,WAAW,IAAI;AACnB;;AAGF,OAAM;EACN;AAEF,IAAI,IAAI,QAAQ,MAAM,CAAC;AACvB,MAAM,SAAS,QAAQ,QAAQ;AAI/B,MAAMA,aAA0D,EAAE;AAGlE,MAAM,gBAAgB;AAEtB,OAAO,KAAK,eAAe,OAAO,KAAc,QAAkB;AAChE,SAAQ,KAAK,8BAA8B,IAAI,KAAK;CAGpD,MAAM,YAAY,IAAI,MAAM;AAE5B,KAAI,OAAO,cAAc,UAAU;AACjC,MAAI,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,mBAAmB,CAAC;AACrD;;CAEF,MAAM,YAAY,WAAW;AAC7B,KAAI,CAAC,WAAW;AACd,MAAI,OAAO,IAAI,CAAC,KAAK,EAAE,UAAU,qCAAqC,CAAC;AACvE;;AAOF,OAAM,UAAU,kBAAkB,KAAK,KAAK,IAAI,KAAK;EAGrD;AAKF,OAAO,IAAI,KAAK,OAAO,MAAe,QAAkB;AACtD,SAAQ,KAAK,8BAA8B;CAE3C,MAAM,YAAY,IAAI,mBAAmB,eAAe,IAAI;AAC5D,SAAQ,KAAK,2CAA2C,UAAU,UAAU;AAE5E,YAAW,UAAU,aAAa;AAElC,SAAQ,KAAK,GAAG,OAAO,KAAK,WAAW,CAAC,OAAO,kBAAkB;AAEjE,KAAI,GAAG,eAAe;AACpB,UAAQ,KAAK,wBAAwB;AACrC,SAAO,WAAW,UAAU;GAC5B;AAEF,OAAM,OAAO,QAAQ,UAAU;AAG/B,OAAM,aAAa,UAAU;EAG7B;AAEF,MAAM,eAAe,OAAO,cAAkC;AAC5D,KAAI;AAIF,QAAM,UAAU,KAAK;GACnB,SAAS;GACT,QAAQ;GACR,QAAQ,EAAE,SAAS,kBAAkB;GACtC,CAAC;AACF,UAAQ,KAAK,iBAAiB;EAE9B,IAAI,eAAe;EACnB,MAAM,WAAW,YAAY,YAAY;AACvC;GAEA,MAAM,UAAU,WAAW,aAAa,uBAAM,IAAI,MAAM,EAAC,aAAa;AAEtE,OAAI;AACF,UAAM,UAAU,KAAK;KACnB,SAAS;KACT,QAAQ;KACR,QAAQ,EAAE,MAAM,SAAS;KAC1B,CAAC;AAEF,YAAQ,KAAK,SAAS,UAAU;AAEhC,QAAI,iBAAiB,GAAG;AACtB,mBAAc,SAAS;AACvB,WAAM,UAAU,KAAK;MACnB,SAAS;MACT,QAAQ;MACR,QAAQ,EAAE,SAAS,oBAAoB;MACxC,CAAC;AACF,aAAQ,KAAK,mBAAmB;;YAE3B,OAAO;AACd,YAAQ,MAAM,0BAA0B,MAAM;AAC9C,kBAAc,SAAS;;KAExB,IAAK;UACD,OAAO;AACd,UAAQ,MAAM,0BAA0B,MAAM;;;AAIlD,IAAI,IAAI,KAAK,OAAO;AAEpB,IAAI,IAAI,YAAY,MAAe,QAAkB;AACnD,KAAI,KAAK,KAAK;EACd;AAEF,MAAM,OAAO,QAAQ,IAAI,QAAQ;AAEjC,IAAI,OAAO,YAAY;AACrB,SAAQ,KAAK,gDAAgD,OAAO;EACpE"}
@@ -1,14 +1,18 @@
1
1
  #!/usr/bin/env node
2
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
2
  import { loadServer } from "./server.mjs";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+
5
+ //#region src/server/stdio.ts
4
6
  const server = loadServer(true);
5
7
  const main = async () => {
6
- const transport = new StdioServerTransport();
7
- await server.connect(transport);
8
- console.error("Intlayer MCP Server running on stdio");
8
+ const transport = new StdioServerTransport();
9
+ await server.connect(transport);
10
+ console.error("Intlayer MCP Server running on stdio");
9
11
  };
10
12
  main().catch((error) => {
11
- console.error("Fatal error in main():", error);
12
- process.exit(1);
13
+ console.error("Fatal error in main():", error);
14
+ process.exit(1);
13
15
  });
16
+
17
+ //#endregion
14
18
  //# sourceMappingURL=stdio.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/server/stdio.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadServer } from './server';\n\nconst server = loadServer(true);\n\nconst main = async () => {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Intlayer MCP Server running on stdio');\n};\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"],"mappings":";AAEA,SAAS,4BAA4B;AACrC,SAAS,kBAAkB;AAE3B,MAAM,SAAS,WAAW,IAAI;AAE9B,MAAM,OAAO,YAAY;AACvB,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,UAAQ,MAAM,sCAAsC;AACtD;AAEA,KAAK,EAAE,MAAM,CAAC,UAAU;AACtB,UAAQ,MAAM,0BAA0B,KAAK;AAC7C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"file":"stdio.mjs","names":[],"sources":["../../../src/server/stdio.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { loadServer } from './server';\n\nconst server = loadServer(true);\n\nconst main = async () => {\n const transport = new StdioServerTransport();\n await server.connect(transport);\n console.error('Intlayer MCP Server running on stdio');\n};\n\nmain().catch((error) => {\n console.error('Fatal error in main():', error);\n process.exit(1);\n});\n"],"mappings":";;;;;AAKA,MAAM,SAAS,WAAW,KAAK;AAE/B,MAAM,OAAO,YAAY;CACvB,MAAM,YAAY,IAAI,sBAAsB;AAC5C,OAAM,OAAO,QAAQ,UAAU;AAC/B,SAAQ,MAAM,uCAAuC;;AAGvD,MAAM,CAAC,OAAO,UAAU;AACtB,SAAQ,MAAM,0BAA0B,MAAM;AAC9C,SAAQ,KAAK,EAAE;EACf"}
@@ -1,243 +1,202 @@
1
- import {
2
- fill,
3
- listContentDeclarationRows,
4
- listMissingTranslations,
5
- pull,
6
- push
7
- } from "@intlayer/cli";
8
- import { Locales } from "@intlayer/config";
9
- import z from "zod";
1
+ import { build, fill, listContentDeclarationRows, listMissingTranslations, pull, push } from "@intlayer/cli";
2
+ import { Locales } from "@intlayer/types";
3
+ import z from "zod/v3";
4
+
5
+ //#region src/tools/cli.ts
10
6
  const loadCLITools = async (server) => {
11
- server.tool(
12
- "intlayer-fill",
13
- "Fill the dictionaries with missing translations / review translations using Intlayer servers",
14
- {
15
- sourceLocale: z.nativeEnum(Locales).optional().describe("Source locale"),
16
- outputLocales: z.union([z.nativeEnum(Locales), z.array(z.nativeEnum(Locales))]).optional().describe("Output locales"),
17
- file: z.union([z.string(), z.array(z.string())]).optional().describe("File path"),
18
- mode: z.enum(["complete", "review"]).optional().describe("Fill mode"),
19
- keys: z.union([z.string(), z.array(z.string())]).optional().describe("Keys to include"),
20
- excludedKeys: z.union([z.string(), z.array(z.string())]).optional().describe("Keys to exclude"),
21
- pathFilter: z.union([z.string(), z.array(z.string())]).optional().describe("Path filter"),
22
- gitOptions: z.object({
23
- gitDiff: z.boolean().optional(),
24
- gitDiffBase: z.string().optional(),
25
- gitDiffCurrent: z.string().optional(),
26
- uncommitted: z.boolean().optional(),
27
- unpushed: z.boolean().optional(),
28
- untracked: z.boolean().optional()
29
- }).optional().describe("Git options"),
30
- aiOptions: z.object({
31
- provider: z.string().optional(),
32
- temperature: z.number().optional(),
33
- model: z.string().optional(),
34
- apiKey: z.string().optional(),
35
- customPrompt: z.string().optional(),
36
- applicationContext: z.string().optional()
37
- }).optional().describe("AI options")
38
- },
39
- async (props) => {
40
- try {
41
- const { gitOptions, ...rest } = props;
42
- const fillOptions = { ...rest, gitOptions: void 0 };
43
- if (gitOptions) {
44
- const { gitDiff, uncommitted, unpushed, untracked, ...restGit } = gitOptions;
45
- const mode = [];
46
- if (gitDiff) mode.push("gitDiff");
47
- if (uncommitted) mode.push("uncommitted");
48
- if (unpushed) mode.push("unpushed");
49
- if (untracked) mode.push("untracked");
50
- fillOptions.gitOptions = { ...restGit, mode };
51
- }
52
- await fill(fillOptions);
53
- return {
54
- content: [
55
- {
56
- type: "text",
57
- text: "Fill successful."
58
- }
59
- ]
60
- };
61
- } catch (error) {
62
- const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
63
- return {
64
- content: [
65
- {
66
- type: "text",
67
- text: `Fill failed: ${errorMessage}`
68
- }
69
- ]
70
- };
71
- }
72
- }
73
- );
74
- server.tool(
75
- "intlayer-push",
76
- "Push local dictionaries to the server",
77
- {
78
- deleteLocaleDictionary: z.boolean().optional().describe("Delete local dictionary after push"),
79
- keepLocaleDictionary: z.boolean().optional().describe("Keep local dictionary after push"),
80
- dictionaries: z.array(z.string()).optional().describe("List of dictionaries to push"),
81
- gitOptions: z.object({
82
- gitDiff: z.boolean().optional(),
83
- gitDiffBase: z.string().optional(),
84
- gitDiffCurrent: z.string().optional(),
85
- uncommitted: z.boolean().optional(),
86
- unpushed: z.boolean().optional(),
87
- untracked: z.boolean().optional()
88
- }).optional().describe("Git options")
89
- },
90
- async (props) => {
91
- try {
92
- const { gitOptions, ...rest } = props;
93
- const pushOptions = { ...rest, gitOptions: void 0 };
94
- if (gitOptions) {
95
- const { gitDiff, uncommitted, unpushed, untracked, ...restGit } = gitOptions;
96
- const mode = [];
97
- if (gitDiff) mode.push("gitDiff");
98
- if (uncommitted) mode.push("uncommitted");
99
- if (unpushed) mode.push("unpushed");
100
- if (untracked) mode.push("untracked");
101
- pushOptions.gitOptions = { ...restGit, mode };
102
- }
103
- await push(pushOptions);
104
- return {
105
- content: [
106
- {
107
- type: "text",
108
- text: "Push successful."
109
- }
110
- ]
111
- };
112
- } catch (error) {
113
- const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
114
- return {
115
- content: [
116
- {
117
- type: "text",
118
- text: `Push failed: ${errorMessage}`
119
- }
120
- ]
121
- };
122
- }
123
- }
124
- );
125
- server.tool(
126
- "intlayer-pull",
127
- "Pull dictionaries from the CMS",
128
- {
129
- dictionaries: z.array(z.string()).optional().describe("List of dictionaries to pull"),
130
- newDictionariesPath: z.string().optional().describe("Path to save new dictionaries")
131
- },
132
- async (props) => {
133
- try {
134
- await pull(props);
135
- return {
136
- content: [
137
- {
138
- type: "text",
139
- text: "Pull successful."
140
- }
141
- ]
142
- };
143
- } catch (error) {
144
- const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
145
- return {
146
- content: [
147
- {
148
- type: "text",
149
- text: `Pull failed: ${errorMessage}`
150
- }
151
- ]
152
- };
153
- }
154
- }
155
- );
156
- server.tool(
157
- "intlayer-content-list",
158
- "List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.",
159
- {
160
- configOptions: z.object({
161
- baseDir: z.string().optional(),
162
- env: z.string().optional(),
163
- envFile: z.string().optional(),
164
- override: z.object({
165
- log: z.object({
166
- prefix: z.string().optional(),
167
- verbose: z.boolean().optional()
168
- }).optional()
169
- }).optional()
170
- }).optional().describe("Configuration options")
171
- },
172
- async (props) => {
173
- try {
174
- const rows = listContentDeclarationRows(props);
175
- return {
176
- content: [
177
- {
178
- type: "text",
179
- text: JSON.stringify(rows, null, 2)
180
- }
181
- ]
182
- };
183
- } catch (error) {
184
- const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
185
- return {
186
- content: [
187
- {
188
- type: "text",
189
- text: `Content list failed: ${errorMessage}`
190
- }
191
- ]
192
- };
193
- }
194
- }
195
- );
196
- server.tool(
197
- "intlayer-content-test",
198
- "Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.",
199
- {
200
- configOptions: z.object({
201
- baseDir: z.string().optional(),
202
- env: z.string().optional(),
203
- envFile: z.string().optional(),
204
- override: z.object({
205
- log: z.object({
206
- prefix: z.string().optional(),
207
- verbose: z.boolean().optional()
208
- }).optional()
209
- }).optional()
210
- }).optional().describe("Configuration options")
211
- },
212
- async (props) => {
213
- try {
214
- const missingTranslations = listMissingTranslations(
215
- void 0,
216
- props?.configOptions
217
- );
218
- return {
219
- content: [
220
- {
221
- type: "text",
222
- text: JSON.stringify(missingTranslations, null, 2)
223
- }
224
- ]
225
- };
226
- } catch (error) {
227
- const errorMessage = error instanceof Error ? error.message : "An unknown error occurred";
228
- return {
229
- content: [
230
- {
231
- type: "text",
232
- text: `Content test failed: ${errorMessage}`
233
- }
234
- ]
235
- };
236
- }
237
- }
238
- );
239
- };
240
- export {
241
- loadCLITools
7
+ server.tool("intlayer-build", "Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.", {
8
+ watch: z.boolean().optional().describe("Watch for changes"),
9
+ baseDir: z.string().optional().describe("Base directory"),
10
+ env: z.string().optional().describe("Environment"),
11
+ envFile: z.string().optional().describe("Environment file"),
12
+ verbose: z.boolean().optional().describe("Verbose output"),
13
+ prefix: z.string().optional().describe("Log prefix")
14
+ }, async ({ watch, baseDir, env, envFile, verbose, prefix }) => {
15
+ try {
16
+ const log = {};
17
+ if (verbose) log.mode = "verbose";
18
+ if (prefix) log.prefix = prefix;
19
+ await build({
20
+ watch,
21
+ configOptions: {
22
+ baseDir,
23
+ env,
24
+ envFile,
25
+ override: { log }
26
+ }
27
+ });
28
+ return { content: [{
29
+ type: "text",
30
+ text: "Build successful."
31
+ }] };
32
+ } catch (error) {
33
+ return { content: [{
34
+ type: "text",
35
+ text: `Build failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
36
+ }] };
37
+ }
38
+ });
39
+ server.tool("intlayer-fill", "Fill the dictionaries with missing translations / review translations using Intlayer servers", {
40
+ sourceLocale: z.nativeEnum(Locales.ALL_LOCALES).optional().describe("Source locale"),
41
+ outputLocales: z.union([z.nativeEnum(Locales.ALL_LOCALES), z.array(z.nativeEnum(Locales.ALL_LOCALES))]).optional().describe("Output locales"),
42
+ file: z.union([z.string(), z.array(z.string())]).optional().describe("File path"),
43
+ mode: z.enum(["complete", "review"]).optional().describe("Fill mode"),
44
+ keys: z.union([z.string(), z.array(z.string())]).optional().describe("Keys to include"),
45
+ excludedKeys: z.union([z.string(), z.array(z.string())]).optional().describe("Keys to exclude"),
46
+ pathFilter: z.union([z.string(), z.array(z.string())]).optional().describe("Path filter"),
47
+ gitOptions: z.object({
48
+ gitDiff: z.boolean().optional(),
49
+ gitDiffBase: z.string().optional(),
50
+ gitDiffCurrent: z.string().optional(),
51
+ uncommitted: z.boolean().optional(),
52
+ unpushed: z.boolean().optional(),
53
+ untracked: z.boolean().optional()
54
+ }).optional().describe("Git options"),
55
+ aiOptions: z.object({
56
+ provider: z.string().optional(),
57
+ temperature: z.number().optional(),
58
+ model: z.string().optional(),
59
+ apiKey: z.string().optional(),
60
+ customPrompt: z.string().optional(),
61
+ applicationContext: z.string().optional()
62
+ }).optional().describe("AI options")
63
+ }, async (props) => {
64
+ try {
65
+ const { gitOptions,...rest } = props;
66
+ const fillOptions = {
67
+ ...rest,
68
+ gitOptions: void 0
69
+ };
70
+ if (gitOptions) {
71
+ const { gitDiff, uncommitted, unpushed, untracked,...restGit } = gitOptions;
72
+ const mode = [];
73
+ if (gitDiff) mode.push("gitDiff");
74
+ if (uncommitted) mode.push("uncommitted");
75
+ if (unpushed) mode.push("unpushed");
76
+ if (untracked) mode.push("untracked");
77
+ fillOptions.gitOptions = {
78
+ ...restGit,
79
+ mode
80
+ };
81
+ }
82
+ await fill(fillOptions);
83
+ return { content: [{
84
+ type: "text",
85
+ text: "Fill successful."
86
+ }] };
87
+ } catch (error) {
88
+ return { content: [{
89
+ type: "text",
90
+ text: `Fill failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
91
+ }] };
92
+ }
93
+ });
94
+ server.tool("intlayer-push", "Push local dictionaries to the server", {
95
+ deleteLocaleDictionary: z.boolean().optional().describe("Delete local dictionary after push"),
96
+ keepLocaleDictionary: z.boolean().optional().describe("Keep local dictionary after push"),
97
+ dictionaries: z.array(z.string()).optional().describe("List of dictionaries to push"),
98
+ gitOptions: z.object({
99
+ gitDiff: z.boolean().optional(),
100
+ gitDiffBase: z.string().optional(),
101
+ gitDiffCurrent: z.string().optional(),
102
+ uncommitted: z.boolean().optional(),
103
+ unpushed: z.boolean().optional(),
104
+ untracked: z.boolean().optional()
105
+ }).optional().describe("Git options")
106
+ }, async (props) => {
107
+ try {
108
+ const { gitOptions,...rest } = props;
109
+ const pushOptions = {
110
+ ...rest,
111
+ gitOptions: void 0
112
+ };
113
+ if (gitOptions) {
114
+ const { gitDiff, uncommitted, unpushed, untracked,...restGit } = gitOptions;
115
+ const mode = [];
116
+ if (gitDiff) mode.push("gitDiff");
117
+ if (uncommitted) mode.push("uncommitted");
118
+ if (unpushed) mode.push("unpushed");
119
+ if (untracked) mode.push("untracked");
120
+ pushOptions.gitOptions = {
121
+ ...restGit,
122
+ mode
123
+ };
124
+ }
125
+ await push(pushOptions);
126
+ return { content: [{
127
+ type: "text",
128
+ text: "Push successful."
129
+ }] };
130
+ } catch (error) {
131
+ return { content: [{
132
+ type: "text",
133
+ text: `Push failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
134
+ }] };
135
+ }
136
+ });
137
+ server.tool("intlayer-pull", "Pull dictionaries from the CMS", {
138
+ dictionaries: z.array(z.string()).optional().describe("List of dictionaries to pull"),
139
+ newDictionariesPath: z.string().optional().describe("Path to save new dictionaries")
140
+ }, async (props) => {
141
+ try {
142
+ await pull(props);
143
+ return { content: [{
144
+ type: "text",
145
+ text: "Pull successful."
146
+ }] };
147
+ } catch (error) {
148
+ return { content: [{
149
+ type: "text",
150
+ text: `Pull failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
151
+ }] };
152
+ }
153
+ });
154
+ server.tool("intlayer-content-list", "List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.", { configOptions: z.object({
155
+ baseDir: z.string().optional(),
156
+ env: z.string().optional(),
157
+ envFile: z.string().optional(),
158
+ override: z.object({ log: z.object({
159
+ prefix: z.string().optional(),
160
+ verbose: z.boolean().optional()
161
+ }).optional() }).optional()
162
+ }).optional().describe("Configuration options") }, async (props) => {
163
+ try {
164
+ const rows = listContentDeclarationRows(props);
165
+ return { content: [{
166
+ type: "text",
167
+ text: JSON.stringify(rows, null, 2)
168
+ }] };
169
+ } catch (error) {
170
+ return { content: [{
171
+ type: "text",
172
+ text: `Content list failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
173
+ }] };
174
+ }
175
+ });
176
+ server.tool("intlayer-content-test", "Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.", { configOptions: z.object({
177
+ baseDir: z.string().optional(),
178
+ env: z.string().optional(),
179
+ envFile: z.string().optional(),
180
+ override: z.object({ log: z.object({
181
+ prefix: z.string().optional(),
182
+ verbose: z.boolean().optional()
183
+ }).optional() }).optional()
184
+ }).optional().describe("Configuration options") }, async (props) => {
185
+ try {
186
+ const missingTranslations = listMissingTranslations(void 0, props?.configOptions);
187
+ return { content: [{
188
+ type: "text",
189
+ text: JSON.stringify(missingTranslations, null, 2)
190
+ }] };
191
+ } catch (error) {
192
+ return { content: [{
193
+ type: "text",
194
+ text: `Content test failed: ${error instanceof Error ? error.message : "An unknown error occurred"}`
195
+ }] };
196
+ }
197
+ });
242
198
  };
199
+
200
+ //#endregion
201
+ export { loadCLITools };
243
202
  //# sourceMappingURL=cli.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import {\n fill,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales } from '@intlayer/config';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod';\n\nexport const loadCLITools = async (server: McpServer) => {\n server.tool(\n 'intlayer-fill',\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n {\n sourceLocale: z.nativeEnum(Locales).optional().describe('Source locale'),\n outputLocales: z\n .union([z.nativeEnum(Locales), z.array(z.nativeEnum(Locales))])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-push',\n 'Push local dictionaries to the server',\n {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-pull',\n 'Pull dictionaries from the CMS',\n {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-content-list',\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-content-test',\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n undefined,\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"cli.mjs","names":["loadCLITools: LoadCLITools","log: Partial<LogConfig>","fillOptions: any","pushOptions: any"],"sources":["../../../src/tools/cli.ts"],"sourcesContent":["import {\n build,\n fill,\n listContentDeclarationRows,\n listMissingTranslations,\n pull,\n push,\n} from '@intlayer/cli';\nimport { Locales, type LogConfig } from '@intlayer/types';\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport z from 'zod/v3';\n\ntype LoadCLITools = (server: McpServer) => Promise<void>;\n\nexport const loadCLITools: LoadCLITools = async (server) => {\n server.tool(\n 'intlayer-build',\n 'Build the dictionaries. List all content declarations files `.content.{ts,tsx,js,json,...}` to update the content callable using the `useIntlayer` hook.',\n {\n watch: z.boolean().optional().describe('Watch for changes'),\n baseDir: z.string().optional().describe('Base directory'),\n env: z.string().optional().describe('Environment'),\n envFile: z.string().optional().describe('Environment file'),\n verbose: z.boolean().optional().describe('Verbose output'),\n prefix: z.string().optional().describe('Log prefix'),\n },\n async ({ watch, baseDir, env, envFile, verbose, prefix }) => {\n try {\n const log: Partial<LogConfig> = {};\n if (verbose) {\n log.mode = 'verbose';\n }\n if (prefix) {\n log.prefix = prefix;\n }\n\n await build({\n watch,\n configOptions: {\n baseDir,\n env,\n envFile,\n override: {\n log,\n },\n },\n });\n\n return {\n content: [\n {\n type: 'text',\n text: 'Build successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Build failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-fill',\n 'Fill the dictionaries with missing translations / review translations using Intlayer servers',\n {\n sourceLocale: z\n .nativeEnum(Locales.ALL_LOCALES)\n .optional()\n .describe('Source locale'),\n outputLocales: z\n .union([\n z.nativeEnum(Locales.ALL_LOCALES),\n z.array(z.nativeEnum(Locales.ALL_LOCALES)),\n ])\n .optional()\n .describe('Output locales'),\n file: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('File path'),\n mode: z.enum(['complete', 'review']).optional().describe('Fill mode'),\n keys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to include'),\n excludedKeys: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Keys to exclude'),\n pathFilter: z\n .union([z.string(), z.array(z.string())])\n .optional()\n .describe('Path filter'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n aiOptions: z\n .object({\n provider: z.string().optional(),\n temperature: z.number().optional(),\n model: z.string().optional(),\n apiKey: z.string().optional(),\n customPrompt: z.string().optional(),\n applicationContext: z.string().optional(),\n })\n .optional()\n .describe('AI options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const fillOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n fillOptions.gitOptions = { ...restGit, mode };\n }\n\n await fill(fillOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Fill successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Fill failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-push',\n 'Push local dictionaries to the server',\n {\n deleteLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Delete local dictionary after push'),\n keepLocaleDictionary: z\n .boolean()\n .optional()\n .describe('Keep local dictionary after push'),\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to push'),\n gitOptions: z\n .object({\n gitDiff: z.boolean().optional(),\n gitDiffBase: z.string().optional(),\n gitDiffCurrent: z.string().optional(),\n uncommitted: z.boolean().optional(),\n unpushed: z.boolean().optional(),\n untracked: z.boolean().optional(),\n })\n .optional()\n .describe('Git options'),\n },\n async (props) => {\n try {\n const { gitOptions, ...rest } = props;\n const pushOptions: any = { ...rest, gitOptions: undefined };\n\n if (gitOptions) {\n const { gitDiff, uncommitted, unpushed, untracked, ...restGit } =\n gitOptions;\n const mode = [];\n if (gitDiff) mode.push('gitDiff');\n if (uncommitted) mode.push('uncommitted');\n if (unpushed) mode.push('unpushed');\n if (untracked) mode.push('untracked');\n\n pushOptions.gitOptions = { ...restGit, mode };\n }\n\n await push(pushOptions);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Push successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Push failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-pull',\n 'Pull dictionaries from the CMS',\n {\n dictionaries: z\n .array(z.string())\n .optional()\n .describe('List of dictionaries to pull'),\n newDictionariesPath: z\n .string()\n .optional()\n .describe('Path to save new dictionaries'),\n },\n async (props) => {\n try {\n await pull(props);\n\n return {\n content: [\n {\n type: 'text',\n text: 'Pull successful.',\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Pull failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-content-list',\n 'List the content declaration (.content.{ts,tsx,js,json,...}) files present in the project. That files contain the multilingual content of the application and are used to build the dictionaries.',\n {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n async (props) => {\n try {\n const rows = listContentDeclarationRows(props);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(rows, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content list failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n\n server.tool(\n 'intlayer-content-test',\n 'Test if there are missing translations in the content declaration files. That files contain the multilingual content of the application and are used to build the dictionaries.',\n {\n configOptions: z\n .object({\n baseDir: z.string().optional(),\n env: z.string().optional(),\n envFile: z.string().optional(),\n override: z\n .object({\n log: z\n .object({\n prefix: z.string().optional(),\n verbose: z.boolean().optional(),\n })\n .optional(),\n })\n .optional(),\n })\n .optional()\n .describe('Configuration options'),\n },\n async (props) => {\n try {\n const missingTranslations = listMissingTranslations(\n undefined,\n props?.configOptions\n );\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(missingTranslations, null, 2),\n },\n ],\n };\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'An unknown error occurred';\n return {\n content: [\n {\n type: 'text',\n text: `Content test failed: ${errorMessage}`,\n },\n ],\n };\n }\n }\n );\n};\n"],"mappings":"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"}