@intlayer/mcp 8.11.1 → 8.11.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.
- package/dist/esm/client/client.mjs +1 -1
- package/dist/esm/server/server.mjs +4 -2
- package/dist/esm/server/server.mjs.map +1 -1
- package/dist/esm/server/sse.mjs +2 -4
- package/dist/esm/server/sse.mjs.map +1 -1
- package/dist/esm/tools/api.mjs +9 -12
- package/dist/esm/tools/api.mjs.map +1 -1
- package/dist/esm/tools/cli.mjs +2 -2
- package/dist/esm/tools/index.mjs +2 -1
- package/dist/esm/tools/installLSP.mjs +31 -0
- package/dist/esm/tools/installLSP.mjs.map +1 -0
- package/dist/types/server/server.d.ts.map +1 -1
- package/dist/types/tools/api.d.ts.map +1 -1
- package/dist/types/tools/index.d.ts +2 -1
- package/dist/types/tools/installLSP.d.ts +7 -0
- package/dist/types/tools/installLSP.d.ts.map +1 -0
- package/package.json +13 -11
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { dirname as dirname$1 } from "node:path";
|
|
2
|
-
import { createMCPClient } from "@ai-sdk/mcp";
|
|
3
2
|
import { fileURLToPath } from "node:url";
|
|
4
3
|
import { isESModule } from "@intlayer/config/utils";
|
|
4
|
+
import { createMCPClient } from "@ai-sdk/mcp";
|
|
5
5
|
|
|
6
6
|
//#region src/client/client.ts
|
|
7
7
|
const dirname = isESModule ? dirname$1(fileURLToPath(import.meta.url)) : __dirname;
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { loadInstallLSPTool } from "../tools/installLSP.mjs";
|
|
1
2
|
import { loadCLITools } from "../tools/cli.mjs";
|
|
2
3
|
import { loadAPITools } from "../tools/api.mjs";
|
|
3
4
|
import { loadInstallSkillsTool } from "../tools/installSkills.mjs";
|
|
4
5
|
import { loadDocsTools } from "../tools/docs.mjs";
|
|
5
|
-
import { dirname as dirname$1, resolve } from "node:path";
|
|
6
6
|
import z from "zod";
|
|
7
|
+
import { dirname as dirname$1, resolve } from "node:path";
|
|
8
|
+
import { readFileSync } from "node:fs";
|
|
7
9
|
import { fileURLToPath } from "node:url";
|
|
8
10
|
import { isESModule } from "@intlayer/config/utils";
|
|
9
|
-
import { readFileSync } from "node:fs";
|
|
10
11
|
|
|
11
12
|
//#region src/server/server.ts
|
|
12
13
|
const dirname = isESModule ? dirname$1(fileURLToPath(import.meta.url)) : __dirname;
|
|
@@ -124,6 +125,7 @@ const loadServer = ({ isLocal }) => {
|
|
|
124
125
|
if (isLocal) try {
|
|
125
126
|
loadCLITools(server);
|
|
126
127
|
loadInstallSkillsTool(server);
|
|
128
|
+
loadInstallLSPTool(server);
|
|
127
129
|
} catch (error) {
|
|
128
130
|
console.error("Error loading CLI tools:", error);
|
|
129
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.mjs","names":["pathDirname"],"sources":["../../../src/server/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config/utils';\nimport z from 'zod';\nimport { loadAPITools } from '../tools/api';\nimport { loadCLITools } from '../tools/cli';\nimport { loadDocsTools } from '../tools/docs';\nimport { loadInstallSkillsTool } from '../tools/installSkills';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype ToolResult = {\n content: { type: string; text: string }[];\n isError?: boolean;\n};\n\ntype StoredTool = {\n name: string;\n description?: string;\n annotations?: Record<string, any>;\n inputSchema: Record<string, any>;\n handler: (params: any) => Promise<ToolResult>;\n};\n\nexport interface McpTransport {\n start(server: McpServer): Promise<void>;\n}\n\nexport class McpServer {\n private readonly _tools = new Map<string, StoredTool>();\n private readonly _info: { name: string; version: string };\n\n constructor(info: { name: string; version: string }) {\n this._info = info;\n }\n\n registerTool(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: Record<string, any>;\n annotations?: Record<string, any>;\n },\n handler: (params: any) => Promise<ToolResult>\n ): void {\n const shape = config.inputSchema ?? {};\n let inputSchema: Record<string, any>;\n try {\n inputSchema = z.toJSONSchema(z.object(shape)) as Record<string, any>;\n } catch {\n inputSchema = { type: 'object', properties: {} };\n }\n this._tools.set(name, {\n name,\n description: config.description,\n annotations: config.annotations,\n inputSchema,\n handler,\n });\n }\n\n async handleMessage(message: any): Promise<any> {\n const { id, method, params } = message;\n const isNotification = id === undefined;\n\n switch (method) {\n case 'initialize':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: this._info,\n },\n };\n\n case 'tools/list':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: Array.from(this._tools.values()).map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations && { annotations: t.annotations }),\n })),\n },\n };\n\n case 'tools/call': {\n const { name, arguments: args } = params ?? {};\n const tool = this._tools.get(name);\n if (!tool) {\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: { code: -32601, message: `Tool not found: ${name}` },\n };\n }\n try {\n const result = await tool.handler(args ?? {});\n if (isNotification) return null;\n return { jsonrpc: '2.0', id, result };\n } catch (error) {\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n case 'ping':\n if (isNotification) return null;\n return { jsonrpc: '2.0', id, result: {} };\n\n default:\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: { code: -32601, message: `Method not found: ${method}` },\n };\n }\n }\n\n async connect(transport: McpTransport): Promise<void> {\n await transport.start(this);\n }\n}\n\ntype LoadServer = (options: { isLocal: boolean }) => McpServer;\n\nexport const loadServer: LoadServer = ({ isLocal }) => {\n const server = new McpServer({\n name: 'intlayer',\n version: packageJson.version,\n });\n\n if (isLocal) {\n try {\n loadCLITools(server);\n loadInstallSkillsTool(server);\n } catch (error) {\n console.error('Error loading CLI tools:', error);\n }\n }\n\n try {\n loadDocsTools(server);\n } catch (error) {\n console.error('Error loading docs tools:', error);\n }\n\n try {\n loadAPITools(server);\n } catch (error) {\n console.error('Error loading API tools:', error);\n }\n\n return server;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.mjs","names":["pathDirname"],"sources":["../../../src/server/server.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname as pathDirname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { isESModule } from '@intlayer/config/utils';\nimport z from 'zod';\nimport { loadAPITools } from '../tools/api';\nimport { loadCLITools } from '../tools/cli';\nimport { loadDocsTools } from '../tools/docs';\nimport { loadInstallLSPTool } from '../tools/installLSP';\nimport { loadInstallSkillsTool } from '../tools/installSkills';\n\nexport const dirname: string = isESModule\n ? pathDirname(fileURLToPath(import.meta.url))\n : __dirname;\n\nconst packageJson: Record<string, any> = JSON.parse(\n readFileSync(resolve(dirname, '../../../package.json'), 'utf8')\n);\n\ntype ToolResult = {\n content: { type: string; text: string }[];\n isError?: boolean;\n};\n\ntype StoredTool = {\n name: string;\n description?: string;\n annotations?: Record<string, any>;\n inputSchema: Record<string, any>;\n handler: (params: any) => Promise<ToolResult>;\n};\n\nexport interface McpTransport {\n start(server: McpServer): Promise<void>;\n}\n\nexport class McpServer {\n private readonly _tools = new Map<string, StoredTool>();\n private readonly _info: { name: string; version: string };\n\n constructor(info: { name: string; version: string }) {\n this._info = info;\n }\n\n registerTool(\n name: string,\n config: {\n title?: string;\n description?: string;\n inputSchema?: Record<string, any>;\n annotations?: Record<string, any>;\n },\n handler: (params: any) => Promise<ToolResult>\n ): void {\n const shape = config.inputSchema ?? {};\n let inputSchema: Record<string, any>;\n try {\n inputSchema = z.toJSONSchema(z.object(shape)) as Record<string, any>;\n } catch {\n inputSchema = { type: 'object', properties: {} };\n }\n this._tools.set(name, {\n name,\n description: config.description,\n annotations: config.annotations,\n inputSchema,\n handler,\n });\n }\n\n async handleMessage(message: any): Promise<any> {\n const { id, method, params } = message;\n const isNotification = id === undefined;\n\n switch (method) {\n case 'initialize':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n protocolVersion: '2024-11-05',\n capabilities: { tools: {} },\n serverInfo: this._info,\n },\n };\n\n case 'tools/list':\n return {\n jsonrpc: '2.0',\n id,\n result: {\n tools: Array.from(this._tools.values()).map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n ...(t.annotations && { annotations: t.annotations }),\n })),\n },\n };\n\n case 'tools/call': {\n const { name, arguments: args } = params ?? {};\n const tool = this._tools.get(name);\n if (!tool) {\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: { code: -32601, message: `Tool not found: ${name}` },\n };\n }\n try {\n const result = await tool.handler(args ?? {});\n if (isNotification) return null;\n return { jsonrpc: '2.0', id, result };\n } catch (error) {\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: {\n code: -32000,\n message: error instanceof Error ? error.message : String(error),\n },\n };\n }\n }\n\n case 'ping':\n if (isNotification) return null;\n return { jsonrpc: '2.0', id, result: {} };\n\n default:\n if (isNotification) return null;\n return {\n jsonrpc: '2.0',\n id,\n error: { code: -32601, message: `Method not found: ${method}` },\n };\n }\n }\n\n async connect(transport: McpTransport): Promise<void> {\n await transport.start(this);\n }\n}\n\ntype LoadServer = (options: { isLocal: boolean }) => McpServer;\n\nexport const loadServer: LoadServer = ({ isLocal }) => {\n const server = new McpServer({\n name: 'intlayer',\n version: packageJson.version,\n });\n\n if (isLocal) {\n try {\n loadCLITools(server);\n loadInstallSkillsTool(server);\n loadInstallLSPTool(server);\n } catch (error) {\n console.error('Error loading CLI tools:', error);\n }\n }\n\n try {\n loadDocsTools(server);\n } catch (error) {\n console.error('Error loading docs tools:', error);\n }\n\n try {\n loadAPITools(server);\n } catch (error) {\n console.error('Error loading API tools:', error);\n }\n\n return server;\n};\n"],"mappings":"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"}
|
package/dist/esm/server/sse.mjs
CHANGED
|
@@ -62,10 +62,8 @@ const startServer = async () => {
|
|
|
62
62
|
});
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
|
-
app.get("/", async (
|
|
66
|
-
|
|
67
|
-
if (!sessionId || !sessions.has(sessionId)) return reply.status(400).send({ messages: "Bad session id." });
|
|
68
|
-
return reply.status(200).send();
|
|
65
|
+
app.get("/", async (_request, reply) => {
|
|
66
|
+
return reply.status(200).send("OK");
|
|
69
67
|
});
|
|
70
68
|
app.delete("/", async (request, reply) => {
|
|
71
69
|
const sessionId = request.headers["mcp-session-id"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.mjs","names":[],"sources":["../../../src/server/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { randomUUID } from 'node:crypto';\nimport fastifyCors from '@fastify/cors';\nimport fastifyHelmet from '@fastify/helmet';\nimport dotenv from 'dotenv';\nimport Fastify from 'fastify';\nimport { loadServer, type McpServer } from './server';\n\nconst startServer = async () => {\n const app = Fastify();\n\n const env = process.env.NODE_ENV || 'development';\n\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n quiet: true,\n });\n\n await app.register(fastifyHelmet, {\n contentSecurityPolicy: false,\n global: true,\n });\n\n await app.register(fastifyCors, {\n origin: '*',\n methods: ['GET', 'POST', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'mcp-session-id'],\n });\n\n const sessions = new Map<string, McpServer>();\n\n app.post('/', async (request, reply) => {\n const sessionId = request.headers['mcp-session-id'] as string | undefined;\n\n let server: McpServer;\n let currentSessionId: string;\n\n if (sessionId && sessions.has(sessionId)) {\n server = sessions.get(sessionId)!;\n currentSessionId = sessionId;\n } else if (!sessionId) {\n currentSessionId = randomUUID();\n server = loadServer({ isLocal: false });\n sessions.set(currentSessionId, server);\n reply.header('mcp-session-id', currentSessionId);\n } else {\n return reply.status(400).send({ messages: 'Bad session id.' });\n }\n\n try {\n const response = await server.handleMessage(request.body);\n if (response !== null && response !== undefined) {\n return reply.send(response);\n }\n return reply.status(202).send();\n } catch (error) {\n return reply.status(500).send({\n jsonrpc: '2.0',\n id: (request.body as any)?.id ?? null,\n error: { code: -32000, message: ['Internal server error', error] },\n });\n }\n });\n\n app.get('/', async (
|
|
1
|
+
{"version":3,"file":"sse.mjs","names":[],"sources":["../../../src/server/sse.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { randomUUID } from 'node:crypto';\nimport fastifyCors from '@fastify/cors';\nimport fastifyHelmet from '@fastify/helmet';\nimport dotenv from 'dotenv';\nimport Fastify from 'fastify';\nimport { loadServer, type McpServer } from './server';\n\nconst startServer = async () => {\n const app = Fastify();\n\n const env = process.env.NODE_ENV || 'development';\n\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n quiet: true,\n });\n\n await app.register(fastifyHelmet, {\n contentSecurityPolicy: false,\n global: true,\n });\n\n await app.register(fastifyCors, {\n origin: '*',\n methods: ['GET', 'POST', 'DELETE', 'OPTIONS'],\n allowedHeaders: ['Content-Type', 'mcp-session-id'],\n });\n\n const sessions = new Map<string, McpServer>();\n\n app.post('/', async (request, reply) => {\n const sessionId = request.headers['mcp-session-id'] as string | undefined;\n\n let server: McpServer;\n let currentSessionId: string;\n\n if (sessionId && sessions.has(sessionId)) {\n server = sessions.get(sessionId)!;\n currentSessionId = sessionId;\n } else if (!sessionId) {\n currentSessionId = randomUUID();\n server = loadServer({ isLocal: false });\n sessions.set(currentSessionId, server);\n reply.header('mcp-session-id', currentSessionId);\n } else {\n return reply.status(400).send({ messages: 'Bad session id.' });\n }\n\n try {\n const response = await server.handleMessage(request.body);\n if (response !== null && response !== undefined) {\n return reply.send(response);\n }\n return reply.status(202).send();\n } catch (error) {\n return reply.status(500).send({\n jsonrpc: '2.0',\n id: (request.body as any)?.id ?? null,\n error: { code: -32000, message: ['Internal server error', error] },\n });\n }\n });\n\n app.get('/', async (_request, reply) => {\n return reply.status(200).send('OK');\n });\n\n app.delete('/', async (request, reply) => {\n const sessionId = request.headers['mcp-session-id'] as string | undefined;\n if (!sessionId || !sessions.has(sessionId)) {\n return reply.status(400).send({ messages: 'Bad session id.' });\n }\n sessions.delete(sessionId);\n return reply.status(200).send();\n });\n\n app.get('/health', async (_request, reply) => {\n return reply.send('OK');\n });\n\n const PORT = Number(process.env.PORT) || 3000;\n await app.listen({ port: PORT, host: '0.0.0.0' });\n console.info(`MCP Streamable HTTP Server listening on port ${PORT}`);\n};\n\nstartServer();\n"],"mappings":";;;;;;;;;AASA,MAAM,cAAc,YAAY;CAC9B,MAAM,MAAM,QAAQ;CAEpB,MAAM;CAEN,OAAO,OAAO;EACZ,MAAM;GAAC,QAAQ,IAAI;GAAS,QAAQ;GAAO;GAAc;EAAM;EAC/D,OAAO;CACT,CAAC;CAED,MAAM,IAAI,SAAS,eAAe;EAChC,uBAAuB;EACvB,QAAQ;CACV,CAAC;CAED,MAAM,IAAI,SAAS,aAAa;EAC9B,QAAQ;EACR,SAAS;GAAC;GAAO;GAAQ;GAAU;EAAS;EAC5C,gBAAgB,CAAC,gBAAgB,gBAAgB;CACnD,CAAC;CAED,MAAM,2BAAW,IAAI,IAAuB;CAE5C,IAAI,KAAK,KAAK,OAAO,SAAS,UAAU;EACtC,MAAM,YAAY,QAAQ,QAAQ;EAElC,IAAI;EACJ,IAAI;EAEJ,IAAI,aAAa,SAAS,IAAI,SAAS,GAAG;GACxC,SAAS,SAAS,IAAI,SAAS;GAC/B,mBAAmB;EACrB,OAAO,IAAI,CAAC,WAAW;GACrB,mBAAmB,WAAW;GAC9B,SAAS,WAAW,EAAE,SAAS,MAAM,CAAC;GACtC,SAAS,IAAI,kBAAkB,MAAM;GACrC,MAAM,OAAO,kBAAkB,gBAAgB;EACjD,OACE,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,kBAAkB,CAAC;EAG/D,IAAI;GACF,MAAM,WAAW,MAAM,OAAO,cAAc,QAAQ,IAAI;GACxD,IAAI,aAAa,QAAQ,aAAa,QACpC,OAAO,MAAM,KAAK,QAAQ;GAE5B,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;EAChC,SAAS,OAAO;GACd,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;IAC5B,SAAS;IACT,IAAK,QAAQ,MAAc,MAAM;IACjC,OAAO;KAAE,MAAM;KAAQ,SAAS,CAAC,yBAAyB,KAAK;IAAE;GACnE,CAAC;EACH;CACF,CAAC;CAED,IAAI,IAAI,KAAK,OAAO,UAAU,UAAU;EACtC,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK,IAAI;CACpC,CAAC;CAED,IAAI,OAAO,KAAK,OAAO,SAAS,UAAU;EACxC,MAAM,YAAY,QAAQ,QAAQ;EAClC,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,SAAS,GACvC,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,UAAU,kBAAkB,CAAC;EAE/D,SAAS,OAAO,SAAS;EACzB,OAAO,MAAM,OAAO,GAAG,EAAE,KAAK;CAChC,CAAC;CAED,IAAI,IAAI,WAAW,OAAO,UAAU,UAAU;EAC5C,OAAO,MAAM,KAAK,IAAI;CACxB,CAAC;CAED,MAAM,OAAO,OAAO,QAAQ,IAAI,IAAI,KAAK;CACzC,MAAM,IAAI,OAAO;EAAE,MAAM;EAAM,MAAM;CAAU,CAAC;CAChD,QAAQ,KAAK,gDAAgD,MAAM;AACrE;AAEA,YAAY"}
|
package/dist/esm/tools/api.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import z from "zod";
|
|
2
2
|
import { getIntlayerAPI } from "@intlayer/api";
|
|
3
|
-
import
|
|
3
|
+
import { editor } from "@intlayer/config/built";
|
|
4
4
|
|
|
5
5
|
//#region src/tools/api.ts
|
|
6
6
|
const authSchema = {
|
|
@@ -8,19 +8,16 @@ const authSchema = {
|
|
|
8
8
|
clientSecret: z.string().optional().describe("Intlayer OAuth2 client secret. Falls back to INTLAYER_CLIENT_SECRET env var.")
|
|
9
9
|
};
|
|
10
10
|
const getAPI = async (clientId, clientSecret) => {
|
|
11
|
-
const resolvedClientId = clientId ??
|
|
12
|
-
const resolvedClientSecret = clientSecret ??
|
|
11
|
+
const resolvedClientId = clientId ?? editor.clientId;
|
|
12
|
+
const resolvedClientSecret = clientSecret ?? editor.clientSecret;
|
|
13
13
|
if (!resolvedClientId || !resolvedClientSecret) throw new Error("Intlayer credentials not found. Provide clientId/clientSecret or set INTLAYER_CLIENT_ID/INTLAYER_CLIENT_SECRET.");
|
|
14
|
-
const token = (await getIntlayerAPI({}, {
|
|
15
|
-
...
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
clientSecret: resolvedClientSecret
|
|
20
|
-
}
|
|
21
|
-
}).oAuth.getOAuth2AccessToken())?.data?.access_token;
|
|
14
|
+
const token = (await getIntlayerAPI({}, { editor: {
|
|
15
|
+
...editor,
|
|
16
|
+
clientId: resolvedClientId,
|
|
17
|
+
clientSecret: resolvedClientSecret
|
|
18
|
+
} }).oAuth.getOAuth2AccessToken())?.data?.access_token;
|
|
22
19
|
if (!token) throw new Error("Failed to obtain OAuth2 access token. Check your credentials.");
|
|
23
|
-
return getIntlayerAPI({ headers: { Authorization: `Bearer ${token}` } },
|
|
20
|
+
return getIntlayerAPI({ headers: { Authorization: `Bearer ${token}` } }, { editor });
|
|
24
21
|
};
|
|
25
22
|
const ok = (data) => ({ content: [{
|
|
26
23
|
type: "text",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.mjs","names":[],"sources":["../../../src/tools/api.ts"],"sourcesContent":["import { getIntlayerAPI } from '@intlayer/api';\nimport { default as config } from '@intlayer/config/built';\nimport z from 'zod';\nimport type { McpServer } from './docs';\n\ntype LoadAPITools = (server: McpServer) => void;\n\nconst authSchema = {\n clientId: z\n .string()\n .optional()\n .describe(\n 'Intlayer OAuth2 client ID (access key). Falls back to INTLAYER_CLIENT_ID env var.'\n ),\n clientSecret: z\n .string()\n .optional()\n .describe(\n 'Intlayer OAuth2 client secret. Falls back to INTLAYER_CLIENT_SECRET env var.'\n ),\n};\n\nconst getAPI = async (clientId?: string, clientSecret?: string) => {\n const resolvedClientId = clientId ?? config.editor.clientId;\n const resolvedClientSecret = clientSecret ?? config.editor.clientSecret;\n\n if (!resolvedClientId || !resolvedClientSecret) {\n throw new Error(\n 'Intlayer credentials not found. Provide clientId/clientSecret or set INTLAYER_CLIENT_ID/INTLAYER_CLIENT_SECRET.'\n );\n }\n\n const configWithCreds = {\n ...config,\n editor: {\n ...config.editor,\n clientId: resolvedClientId,\n clientSecret: resolvedClientSecret,\n },\n };\n\n const tempAPI = getIntlayerAPI({}, configWithCreds);\n const tokenResult = await tempAPI.oAuth.getOAuth2AccessToken();\n const token = (tokenResult as any)?.data?.access_token as string | undefined;\n\n if (!token) {\n throw new Error(\n 'Failed to obtain OAuth2 access token. Check your credentials.'\n );\n }\n\n return getIntlayerAPI(\n { headers: { Authorization: `Bearer ${token}` } },\n config\n );\n};\n\nconst ok = (data: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n});\n\nconst fail = (label: string, error: unknown) => ({\n content: [\n {\n type: 'text' as const,\n text: `${label} failed: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true as const,\n});\n\nexport const loadAPITools: LoadAPITools = (server) => {\n // ── Dictionaries ──────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-dictionaries-list',\n {\n title: 'List Dictionaries',\n description:\n 'List all dictionaries for the selected project. Returns keys, IDs, and metadata.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.getDictionaries({\n page,\n pageSize,\n });\n return ok(result);\n } catch (error) {\n return fail('List dictionaries', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-get',\n {\n title: 'Get Dictionary',\n description: 'Get a dictionary by its key, including its full content.',\n inputSchema: {\n ...authSchema,\n dictionaryKey: z.string().describe('The dictionary key'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, dictionaryKey }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.getDictionary(dictionaryKey);\n return ok(result);\n } catch (error) {\n return fail('Get dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-create',\n {\n title: 'Create Dictionary',\n description: 'Create a new dictionary in the selected project.',\n inputSchema: {\n ...authSchema,\n key: z.string().describe('Unique key for the dictionary'),\n title: z.string().optional().describe('Human-readable title'),\n description: z\n .string()\n .optional()\n .describe('Description of the dictionary'),\n content: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Initial content as JSON object'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, key, title, description, content }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.addDictionary({\n key,\n title,\n description,\n content,\n });\n return ok(result);\n } catch (error) {\n return fail('Create dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-update',\n {\n title: 'Update Dictionary',\n description: 'Update an existing dictionary content or metadata.',\n inputSchema: {\n ...authSchema,\n id: z.string().describe('Dictionary ID'),\n key: z.string().optional().describe('New key for the dictionary'),\n title: z.string().optional().describe('New title'),\n description: z.string().optional().describe('New description'),\n content: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Updated content as JSON object'),\n },\n annotations: { destructiveHint: true },\n },\n async ({\n clientId,\n clientSecret,\n id,\n key,\n title,\n description,\n content,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.updateDictionary({\n id,\n key,\n title,\n description,\n content,\n });\n return ok(result);\n } catch (error) {\n return fail('Update dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-delete',\n {\n title: 'Delete Dictionary',\n description:\n 'Delete a dictionary by its ID. This action is irreversible.',\n inputSchema: {\n ...authSchema,\n dictionaryId: z.string().describe('Dictionary ID to delete'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, dictionaryId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.deleteDictionary(dictionaryId);\n return ok(result);\n } catch (error) {\n return fail('Delete dictionary', error);\n }\n }\n );\n\n // ── Tags ──────────────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-tags-list',\n {\n title: 'List Tags',\n description: 'List all tags for the selected organization.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.getTags({ page, pageSize });\n return ok(result);\n } catch (error) {\n return fail('List tags', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-create',\n {\n title: 'Create Tag',\n description:\n 'Create a new tag in the organization. Tags can be used to group dictionaries and provide AI context.',\n inputSchema: {\n ...authSchema,\n key: z.string().describe('Unique tag key'),\n name: z.string().optional().describe('Display name for the tag'),\n description: z.string().optional().describe('Description of the tag'),\n color: z.string().optional().describe('Tag color (hex code)'),\n instructions: z\n .string()\n .optional()\n .describe('AI instructions to apply when this tag is used'),\n },\n annotations: { destructiveHint: false },\n },\n async ({\n clientId,\n clientSecret,\n key,\n name,\n description,\n color,\n instructions,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.addTag({\n key,\n name,\n description,\n color,\n instructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Create tag', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-update',\n {\n title: 'Update Tag',\n description: 'Update an existing tag.',\n inputSchema: {\n ...authSchema,\n tagId: z.string().describe('Tag ID to update'),\n key: z.string().optional().describe('New key'),\n name: z.string().optional().describe('New display name'),\n description: z.string().optional().describe('New description'),\n color: z.string().optional().describe('New color (hex code)'),\n instructions: z.string().optional().describe('New AI instructions'),\n },\n annotations: { destructiveHint: true },\n },\n async ({\n clientId,\n clientSecret,\n tagId,\n key,\n name,\n description,\n color,\n instructions,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.updateTag(tagId, {\n key,\n name,\n description,\n color,\n instructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Update tag', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-delete',\n {\n title: 'Delete Tag',\n description: 'Delete a tag by its ID.',\n inputSchema: {\n ...authSchema,\n tagId: z.string().describe('Tag ID to delete'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, tagId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.deleteTag(tagId);\n return ok(result);\n } catch (error) {\n return fail('Delete tag', error);\n }\n }\n );\n\n // ── Organizations ─────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-organizations-list',\n {\n title: 'List Organizations',\n description: 'List all organizations the authenticated user belongs to.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.organization.getOrganizations({\n page,\n pageSize,\n });\n return ok(result);\n } catch (error) {\n return fail('List organizations', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-organization-select',\n {\n title: 'Select Organization',\n description:\n 'Select an organization as the current active organization. Required before accessing organization-specific resources.',\n inputSchema: {\n ...authSchema,\n organizationId: z.string().describe('Organization ID to select'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, organizationId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result =\n await api.organization.selectOrganization(organizationId);\n return ok(result);\n } catch (error) {\n return fail('Select organization', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-organization-update',\n {\n title: 'Update Organization',\n description: 'Update the selected organization name or settings.',\n inputSchema: {\n ...authSchema,\n name: z.string().optional().describe('New organization name'),\n customInstructions: z\n .string()\n .optional()\n .describe('Custom AI instructions for this organization'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, name, customInstructions }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.organization.updateOrganization({\n name,\n customInstructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Update organization', error);\n }\n }\n );\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-cms-projects-list',\n {\n title: 'List CMS Projects',\n description:\n 'List all Intlayer CMS projects for the selected organization. These are server-side projects, not local project directories.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.getProjects({ page, pageSize });\n return ok(result);\n } catch (error) {\n return fail('List CMS projects', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-select',\n {\n title: 'Select CMS Project',\n description:\n 'Select a CMS project as the current active project. Required before accessing project-specific dictionaries.',\n inputSchema: {\n ...authSchema,\n projectId: z.string().describe('Project ID to select'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, projectId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.selectProject(projectId);\n return ok(result);\n } catch (error) {\n return fail('Select CMS project', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-create',\n {\n title: 'Create CMS Project',\n description: 'Create a new CMS project in the selected organization.',\n inputSchema: {\n ...authSchema,\n name: z.string().describe('Project name'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, name }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.addProject({ name });\n return ok(result);\n } catch (error) {\n return fail('Create CMS project', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-update',\n {\n title: 'Update CMS Project',\n description: 'Update the selected CMS project settings.',\n inputSchema: {\n ...authSchema,\n name: z.string().optional().describe('New project name'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, name }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.updateProject({ name });\n return ok(result);\n } catch (error) {\n return fail('Update CMS project', error);\n }\n }\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.mjs","names":[],"sources":["../../../src/tools/api.ts"],"sourcesContent":["import { getIntlayerAPI } from '@intlayer/api';\nimport { editor } from '@intlayer/config/built';\nimport z from 'zod';\nimport type { McpServer } from './docs';\n\ntype LoadAPITools = (server: McpServer) => void;\n\nconst authSchema = {\n clientId: z\n .string()\n .optional()\n .describe(\n 'Intlayer OAuth2 client ID (access key). Falls back to INTLAYER_CLIENT_ID env var.'\n ),\n clientSecret: z\n .string()\n .optional()\n .describe(\n 'Intlayer OAuth2 client secret. Falls back to INTLAYER_CLIENT_SECRET env var.'\n ),\n};\n\nconst getAPI = async (clientId?: string, clientSecret?: string) => {\n const resolvedClientId = clientId ?? editor.clientId;\n const resolvedClientSecret = clientSecret ?? editor.clientSecret;\n\n if (!resolvedClientId || !resolvedClientSecret) {\n throw new Error(\n 'Intlayer credentials not found. Provide clientId/clientSecret or set INTLAYER_CLIENT_ID/INTLAYER_CLIENT_SECRET.'\n );\n }\n\n const configWithCreds = {\n editor: {\n ...editor,\n clientId: resolvedClientId,\n clientSecret: resolvedClientSecret,\n },\n };\n\n const tempAPI = getIntlayerAPI({}, configWithCreds);\n const tokenResult = await tempAPI.oAuth.getOAuth2AccessToken();\n const token = (tokenResult as any)?.data?.access_token as string | undefined;\n\n if (!token) {\n throw new Error(\n 'Failed to obtain OAuth2 access token. Check your credentials.'\n );\n }\n\n return getIntlayerAPI(\n { headers: { Authorization: `Bearer ${token}` } },\n { editor }\n );\n};\n\nconst ok = (data: unknown) => ({\n content: [{ type: 'text' as const, text: JSON.stringify(data, null, 2) }],\n});\n\nconst fail = (label: string, error: unknown) => ({\n content: [\n {\n type: 'text' as const,\n text: `${label} failed: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true as const,\n});\n\nexport const loadAPITools: LoadAPITools = (server) => {\n // ── Dictionaries ──────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-dictionaries-list',\n {\n title: 'List Dictionaries',\n description:\n 'List all dictionaries for the selected project. Returns keys, IDs, and metadata.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.getDictionaries({\n page,\n pageSize,\n });\n return ok(result);\n } catch (error) {\n return fail('List dictionaries', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-get',\n {\n title: 'Get Dictionary',\n description: 'Get a dictionary by its key, including its full content.',\n inputSchema: {\n ...authSchema,\n dictionaryKey: z.string().describe('The dictionary key'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, dictionaryKey }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.getDictionary(dictionaryKey);\n return ok(result);\n } catch (error) {\n return fail('Get dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-create',\n {\n title: 'Create Dictionary',\n description: 'Create a new dictionary in the selected project.',\n inputSchema: {\n ...authSchema,\n key: z.string().describe('Unique key for the dictionary'),\n title: z.string().optional().describe('Human-readable title'),\n description: z\n .string()\n .optional()\n .describe('Description of the dictionary'),\n content: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Initial content as JSON object'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, key, title, description, content }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.addDictionary({\n key,\n title,\n description,\n content,\n });\n return ok(result);\n } catch (error) {\n return fail('Create dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-update',\n {\n title: 'Update Dictionary',\n description: 'Update an existing dictionary content or metadata.',\n inputSchema: {\n ...authSchema,\n id: z.string().describe('Dictionary ID'),\n key: z.string().optional().describe('New key for the dictionary'),\n title: z.string().optional().describe('New title'),\n description: z.string().optional().describe('New description'),\n content: z\n .record(z.string(), z.unknown())\n .optional()\n .describe('Updated content as JSON object'),\n },\n annotations: { destructiveHint: true },\n },\n async ({\n clientId,\n clientSecret,\n id,\n key,\n title,\n description,\n content,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.updateDictionary({\n id,\n key,\n title,\n description,\n content,\n });\n return ok(result);\n } catch (error) {\n return fail('Update dictionary', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-dictionary-delete',\n {\n title: 'Delete Dictionary',\n description:\n 'Delete a dictionary by its ID. This action is irreversible.',\n inputSchema: {\n ...authSchema,\n dictionaryId: z.string().describe('Dictionary ID to delete'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, dictionaryId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.dictionary.deleteDictionary(dictionaryId);\n return ok(result);\n } catch (error) {\n return fail('Delete dictionary', error);\n }\n }\n );\n\n // ── Tags ──────────────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-tags-list',\n {\n title: 'List Tags',\n description: 'List all tags for the selected organization.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.getTags({ page, pageSize });\n return ok(result);\n } catch (error) {\n return fail('List tags', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-create',\n {\n title: 'Create Tag',\n description:\n 'Create a new tag in the organization. Tags can be used to group dictionaries and provide AI context.',\n inputSchema: {\n ...authSchema,\n key: z.string().describe('Unique tag key'),\n name: z.string().optional().describe('Display name for the tag'),\n description: z.string().optional().describe('Description of the tag'),\n color: z.string().optional().describe('Tag color (hex code)'),\n instructions: z\n .string()\n .optional()\n .describe('AI instructions to apply when this tag is used'),\n },\n annotations: { destructiveHint: false },\n },\n async ({\n clientId,\n clientSecret,\n key,\n name,\n description,\n color,\n instructions,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.addTag({\n key,\n name,\n description,\n color,\n instructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Create tag', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-update',\n {\n title: 'Update Tag',\n description: 'Update an existing tag.',\n inputSchema: {\n ...authSchema,\n tagId: z.string().describe('Tag ID to update'),\n key: z.string().optional().describe('New key'),\n name: z.string().optional().describe('New display name'),\n description: z.string().optional().describe('New description'),\n color: z.string().optional().describe('New color (hex code)'),\n instructions: z.string().optional().describe('New AI instructions'),\n },\n annotations: { destructiveHint: true },\n },\n async ({\n clientId,\n clientSecret,\n tagId,\n key,\n name,\n description,\n color,\n instructions,\n }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.updateTag(tagId, {\n key,\n name,\n description,\n color,\n instructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Update tag', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-tag-delete',\n {\n title: 'Delete Tag',\n description: 'Delete a tag by its ID.',\n inputSchema: {\n ...authSchema,\n tagId: z.string().describe('Tag ID to delete'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, tagId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.tag.deleteTag(tagId);\n return ok(result);\n } catch (error) {\n return fail('Delete tag', error);\n }\n }\n );\n\n // ── Organizations ─────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-organizations-list',\n {\n title: 'List Organizations',\n description: 'List all organizations the authenticated user belongs to.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.organization.getOrganizations({\n page,\n pageSize,\n });\n return ok(result);\n } catch (error) {\n return fail('List organizations', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-organization-select',\n {\n title: 'Select Organization',\n description:\n 'Select an organization as the current active organization. Required before accessing organization-specific resources.',\n inputSchema: {\n ...authSchema,\n organizationId: z.string().describe('Organization ID to select'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, organizationId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result =\n await api.organization.selectOrganization(organizationId);\n return ok(result);\n } catch (error) {\n return fail('Select organization', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-organization-update',\n {\n title: 'Update Organization',\n description: 'Update the selected organization name or settings.',\n inputSchema: {\n ...authSchema,\n name: z.string().optional().describe('New organization name'),\n customInstructions: z\n .string()\n .optional()\n .describe('Custom AI instructions for this organization'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, name, customInstructions }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.organization.updateOrganization({\n name,\n customInstructions,\n });\n return ok(result);\n } catch (error) {\n return fail('Update organization', error);\n }\n }\n );\n\n // ── Projects ──────────────────────────────────────────────────────────────\n\n server.registerTool(\n 'intlayer-cms-projects-list',\n {\n title: 'List CMS Projects',\n description:\n 'List all Intlayer CMS projects for the selected organization. These are server-side projects, not local project directories.',\n inputSchema: {\n ...authSchema,\n page: z.number().optional().describe('Page number (1-based)'),\n pageSize: z.number().optional().describe('Items per page'),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ clientId, clientSecret, page, pageSize }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.getProjects({ page, pageSize });\n return ok(result);\n } catch (error) {\n return fail('List CMS projects', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-select',\n {\n title: 'Select CMS Project',\n description:\n 'Select a CMS project as the current active project. Required before accessing project-specific dictionaries.',\n inputSchema: {\n ...authSchema,\n projectId: z.string().describe('Project ID to select'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, projectId }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.selectProject(projectId);\n return ok(result);\n } catch (error) {\n return fail('Select CMS project', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-create',\n {\n title: 'Create CMS Project',\n description: 'Create a new CMS project in the selected organization.',\n inputSchema: {\n ...authSchema,\n name: z.string().describe('Project name'),\n },\n annotations: { destructiveHint: false },\n },\n async ({ clientId, clientSecret, name }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.addProject({ name });\n return ok(result);\n } catch (error) {\n return fail('Create CMS project', error);\n }\n }\n );\n\n server.registerTool(\n 'intlayer-cms-project-update',\n {\n title: 'Update CMS Project',\n description: 'Update the selected CMS project settings.',\n inputSchema: {\n ...authSchema,\n name: z.string().optional().describe('New project name'),\n },\n annotations: { destructiveHint: true },\n },\n async ({ clientId, clientSecret, name }) => {\n try {\n const api = await getAPI(clientId, clientSecret);\n const result = await api.project.updateProject({ name });\n return ok(result);\n } catch (error) {\n return fail('Update CMS project', error);\n }\n }\n );\n};\n"],"mappings":"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"}
|
package/dist/esm/tools/cli.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { relative } from "node:path";
|
|
2
1
|
import { listProjects } from "@intlayer/chokidar/cli";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
import { relative } from "node:path";
|
|
3
4
|
import { build, extract, fill, init, listContentDeclarationRows, listMissingTranslations, pull, push } from "@intlayer/cli";
|
|
4
5
|
import { ALL_LOCALES } from "@intlayer/types/allLocales";
|
|
5
|
-
import z from "zod";
|
|
6
6
|
|
|
7
7
|
//#region src/tools/cli.ts
|
|
8
8
|
const configOptionsSchema = z.object({
|
package/dist/esm/tools/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
+
import { loadInstallLSPTool } from "./installLSP.mjs";
|
|
1
2
|
import { loadCLITools } from "./cli.mjs";
|
|
2
3
|
import { loadAPITools } from "./api.mjs";
|
|
3
4
|
import { loadInstallSkillsTool } from "./installSkills.mjs";
|
|
4
5
|
import { loadDocsTools } from "./docs.mjs";
|
|
5
6
|
|
|
6
|
-
export { loadAPITools, loadCLITools, loadDocsTools, loadInstallSkillsTool };
|
|
7
|
+
export { loadAPITools, loadCLITools, loadDocsTools, loadInstallLSPTool, loadInstallSkillsTool };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { installLSP } from "@intlayer/chokidar/cli";
|
|
2
|
+
import z from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/tools/installLSP.ts
|
|
5
|
+
const loadInstallLSPTool = (server) => {
|
|
6
|
+
server.registerTool("intlayer-install-lsp", {
|
|
7
|
+
title: "Install Intlayer LSP",
|
|
8
|
+
description: "Configure the Intlayer Language Server in the project. Writes `intlayer.languageServer.command` and `intlayer.languageServer.args` to `.vscode/settings.json` so that VS Code, Cursor, and Windsurf automatically start the language server, enabling Go-to-Definition for `useIntlayer` and `getIntlayer` calls. Returns next-step instructions for installing the `@intlayer/lsp` binary and, optionally, registering the Intlayer Claude Code plugin.",
|
|
9
|
+
inputSchema: { projectRoot: z.string().describe("Root directory of the project. Defaults to current working directory.").optional() },
|
|
10
|
+
annotations: { destructiveHint: true }
|
|
11
|
+
}, async ({ projectRoot }) => {
|
|
12
|
+
try {
|
|
13
|
+
return { content: [{
|
|
14
|
+
type: "text",
|
|
15
|
+
text: await installLSP(projectRoot ?? process.cwd())
|
|
16
|
+
}] };
|
|
17
|
+
} catch (error) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{
|
|
20
|
+
type: "text",
|
|
21
|
+
text: `Failed to configure LSP: ${error instanceof Error ? error.message : String(error)}`
|
|
22
|
+
}],
|
|
23
|
+
isError: true
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
export { loadInstallLSPTool };
|
|
31
|
+
//# sourceMappingURL=installLSP.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installLSP.mjs","names":[],"sources":["../../../src/tools/installLSP.ts"],"sourcesContent":["import { installLSP } from '@intlayer/chokidar/cli';\nimport z from 'zod';\nimport type { McpServer } from './docs';\n\nexport const loadInstallLSPTool = (server: McpServer): void => {\n server.registerTool(\n 'intlayer-install-lsp',\n {\n title: 'Install Intlayer LSP',\n description:\n 'Configure the Intlayer Language Server in the project. ' +\n 'Writes `intlayer.languageServer.command` and `intlayer.languageServer.args` to `.vscode/settings.json` ' +\n 'so that VS Code, Cursor, and Windsurf automatically start the language server, enabling Go-to-Definition ' +\n 'for `useIntlayer` and `getIntlayer` calls. ' +\n 'Returns next-step instructions for installing the `@intlayer/lsp` binary and, optionally, ' +\n 'registering the Intlayer Claude Code plugin.',\n inputSchema: {\n projectRoot: z\n .string()\n .describe(\n 'Root directory of the project. Defaults to current working directory.'\n )\n .optional(),\n },\n annotations: {\n destructiveHint: true,\n },\n },\n async ({ projectRoot }) => {\n try {\n const root = projectRoot ?? process.cwd();\n const message = await installLSP(root);\n\n return {\n content: [{ type: 'text', text: message }],\n };\n } catch (error) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to configure LSP: ${error instanceof Error ? error.message : String(error)}`,\n },\n ],\n isError: true,\n };\n }\n }\n );\n};\n"],"mappings":";;;;AAIA,MAAa,sBAAsB,WAA4B;CAC7D,OAAO,aACL,wBACA;EACE,OAAO;EACP,aACE;EAMF,aAAa,EACX,aAAa,EACV,OAAO,EACP,SACC,uEACF,EACC,SAAS,EACd;EACA,aAAa,EACX,iBAAiB,KACnB;CACF,GACA,OAAO,EAAE,kBAAkB;EACzB,IAAI;GAIF,OAAO,EACL,SAAS,CAAC;IAAE,MAAM;IAAQ,MAAM,MAHZ,WADT,eAAe,QAAQ,IAAI,CACH;GAGK,CAAC,EAC3C;EACF,SAAS,OAAO;GACd,OAAO;IACL,SAAS,CACP;KACE,MAAM;KACN,MAAM,4BAA4B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;IACzF,CACF;IACA,SAAS;GACX;EACF;CACF,CACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/server.ts"],"mappings":";
|
|
1
|
+
{"version":3,"file":"server.d.ts","names":[],"sources":["../../../src/server/server.ts"],"mappings":";cAWa,OAAA;AAAA,KAQR,UAAA;EACH,OAAA;IAAW,IAAA;IAAc,IAAA;EAAA;EACzB,OAAA;AAAA;AAAA,UAWe,YAAA;EACf,KAAA,CAAM,MAAA,EAAQ,SAAA,GAAY,OAAA;AAAA;AAAA,cAGf,SAAA;EAAA,iBACM,MAAA;EAAA,iBACA,KAAA;EAEjB,WAAA,CAAY,IAAA;IAAQ,IAAA;IAAc,OAAA;EAAA;EAIlC,YAAA,CACE,IAAA,UACA,MAAA;IACE,KAAA;IACA,WAAA;IACA,WAAA,GAAc,MAAA;IACd,WAAA,GAAc,MAAA;EAAA,GAEhB,OAAA,GAAU,MAAA,UAAgB,OAAA,CAAQ,UAAA;EAkBpC,aAAA,CAAoB,OAAA,QAAe,OAAA;EAwEnC,OAAA,CAAc,SAAA,EAAW,YAAA,GAAe,OAAA;AAAA;AAAA,KAKrC,UAAA,IAAc,OAAA;EAAW,OAAA;AAAA,MAAuB,SAAA;AAAA,cAExC,UAAA,EAAY,UAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","names":[],"sources":["../../../src/tools/api.ts"],"mappings":";;;KAKK,YAAA,IAAgB,MAAQ,EAAA,SAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"api.d.ts","names":[],"sources":["../../../src/tools/api.ts"],"mappings":";;;KAKK,YAAA,IAAgB,MAAQ,EAAA,SAAA;AAAA,cAiEhB,YAAA,EAAc,YAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { loadDocsTools } from "./docs.js";
|
|
2
2
|
import { loadAPITools } from "./api.js";
|
|
3
3
|
import { loadCLITools } from "./cli.js";
|
|
4
|
+
import { loadInstallLSPTool } from "./installLSP.js";
|
|
4
5
|
import { loadInstallSkillsTool } from "./installSkills.js";
|
|
5
|
-
export { loadAPITools, loadCLITools, loadDocsTools, loadInstallSkillsTool };
|
|
6
|
+
export { loadAPITools, loadCLITools, loadDocsTools, loadInstallLSPTool, loadInstallSkillsTool };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installLSP.d.ts","names":[],"sources":["../../../src/tools/installLSP.ts"],"mappings":";;;cAIa,kBAAA,GAAsB,MAAQ,EAAA,SAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@intlayer/mcp",
|
|
3
|
-
"version": "8.11.
|
|
3
|
+
"version": "8.11.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Intlayer MCP server. Handle MCP to help IDE to use Intlayer. It build, fill, pull, push, dictionaries",
|
|
6
6
|
"keywords": [
|
|
@@ -9,7 +9,9 @@
|
|
|
9
9
|
"mcp-server",
|
|
10
10
|
"mcp-proxy",
|
|
11
11
|
"documentation",
|
|
12
|
-
"cli"
|
|
12
|
+
"cli",
|
|
13
|
+
"mcp-lsp",
|
|
14
|
+
"mcp-language-server"
|
|
13
15
|
],
|
|
14
16
|
"homepage": "https://intlayer.org",
|
|
15
17
|
"bugs": {
|
|
@@ -109,27 +111,27 @@
|
|
|
109
111
|
"typecheck": "tsc --noEmit --project tsconfig.types.json"
|
|
110
112
|
},
|
|
111
113
|
"dependencies": {
|
|
112
|
-
"@ai-sdk/mcp": "^1.0.
|
|
114
|
+
"@ai-sdk/mcp": "^1.0.44",
|
|
113
115
|
"@fastify/cors": "11.2.0",
|
|
114
116
|
"@fastify/helmet": "13.0.2",
|
|
115
|
-
"@intlayer/api": "8.11.
|
|
116
|
-
"@intlayer/chokidar": "8.11.
|
|
117
|
-
"@intlayer/cli": "8.11.
|
|
118
|
-
"@intlayer/config": "8.11.
|
|
119
|
-
"@intlayer/docs": "8.11.
|
|
120
|
-
"@intlayer/types": "8.11.
|
|
117
|
+
"@intlayer/api": "8.11.3",
|
|
118
|
+
"@intlayer/chokidar": "8.11.3",
|
|
119
|
+
"@intlayer/cli": "8.11.3",
|
|
120
|
+
"@intlayer/config": "8.11.3",
|
|
121
|
+
"@intlayer/docs": "8.11.3",
|
|
122
|
+
"@intlayer/types": "8.11.3",
|
|
121
123
|
"dotenv": "17.4.2",
|
|
122
124
|
"fastify": "5.8.5",
|
|
123
125
|
"zod": "4.4.3"
|
|
124
126
|
},
|
|
125
127
|
"devDependencies": {
|
|
126
|
-
"@intlayer/types": "8.11.
|
|
128
|
+
"@intlayer/types": "8.11.3",
|
|
127
129
|
"@types/node": "25.9.1",
|
|
128
130
|
"@utils/ts-config": "1.0.4",
|
|
129
131
|
"@utils/ts-config-types": "1.0.4",
|
|
130
132
|
"@utils/tsdown-config": "1.0.4",
|
|
131
133
|
"rimraf": "6.1.3",
|
|
132
|
-
"tsdown": "0.22.
|
|
134
|
+
"tsdown": "0.22.1",
|
|
133
135
|
"typescript": "6.0.3",
|
|
134
136
|
"vitest": "4.1.7"
|
|
135
137
|
},
|