syncromsp-mcp 0.1.0

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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -0
  3. package/dist/api-client.d.ts +21 -0
  4. package/dist/api-client.d.ts.map +1 -0
  5. package/dist/api-client.js +117 -0
  6. package/dist/api-client.js.map +1 -0
  7. package/dist/auth.d.ts +37 -0
  8. package/dist/auth.d.ts.map +1 -0
  9. package/dist/auth.js +133 -0
  10. package/dist/auth.js.map +1 -0
  11. package/dist/domains/admin.d.ts +4 -0
  12. package/dist/domains/admin.d.ts.map +1 -0
  13. package/dist/domains/admin.js +807 -0
  14. package/dist/domains/admin.js.map +1 -0
  15. package/dist/domains/appointments.d.ts +4 -0
  16. package/dist/domains/appointments.d.ts.map +1 -0
  17. package/dist/domains/appointments.js +231 -0
  18. package/dist/domains/appointments.js.map +1 -0
  19. package/dist/domains/assets.d.ts +4 -0
  20. package/dist/domains/assets.d.ts.map +1 -0
  21. package/dist/domains/assets.js +138 -0
  22. package/dist/domains/assets.js.map +1 -0
  23. package/dist/domains/contacts.d.ts +4 -0
  24. package/dist/domains/contacts.d.ts.map +1 -0
  25. package/dist/domains/contacts.js +148 -0
  26. package/dist/domains/contacts.js.map +1 -0
  27. package/dist/domains/contracts.d.ts +4 -0
  28. package/dist/domains/contracts.d.ts.map +1 -0
  29. package/dist/domains/contracts.js +125 -0
  30. package/dist/domains/contracts.js.map +1 -0
  31. package/dist/domains/customers.d.ts +4 -0
  32. package/dist/domains/customers.d.ts.map +1 -0
  33. package/dist/domains/customers.js +323 -0
  34. package/dist/domains/customers.js.map +1 -0
  35. package/dist/domains/estimates.d.ts +4 -0
  36. package/dist/domains/estimates.d.ts.map +1 -0
  37. package/dist/domains/estimates.js +262 -0
  38. package/dist/domains/estimates.js.map +1 -0
  39. package/dist/domains/index.d.ts +5 -0
  40. package/dist/domains/index.d.ts.map +1 -0
  41. package/dist/domains/index.js +34 -0
  42. package/dist/domains/index.js.map +1 -0
  43. package/dist/domains/invoices.d.ts +4 -0
  44. package/dist/domains/invoices.d.ts.map +1 -0
  45. package/dist/domains/invoices.js +292 -0
  46. package/dist/domains/invoices.js.map +1 -0
  47. package/dist/domains/leads.d.ts +4 -0
  48. package/dist/domains/leads.d.ts.map +1 -0
  49. package/dist/domains/leads.js +135 -0
  50. package/dist/domains/leads.js.map +1 -0
  51. package/dist/domains/payments.d.ts +4 -0
  52. package/dist/domains/payments.d.ts.map +1 -0
  53. package/dist/domains/payments.js +188 -0
  54. package/dist/domains/payments.js.map +1 -0
  55. package/dist/domains/products.d.ts +4 -0
  56. package/dist/domains/products.d.ts.map +1 -0
  57. package/dist/domains/products.js +350 -0
  58. package/dist/domains/products.js.map +1 -0
  59. package/dist/domains/rmm.d.ts +4 -0
  60. package/dist/domains/rmm.d.ts.map +1 -0
  61. package/dist/domains/rmm.js +100 -0
  62. package/dist/domains/rmm.js.map +1 -0
  63. package/dist/domains/scheduling.d.ts +4 -0
  64. package/dist/domains/scheduling.d.ts.map +1 -0
  65. package/dist/domains/scheduling.js +206 -0
  66. package/dist/domains/scheduling.js.map +1 -0
  67. package/dist/domains/tickets.d.ts +4 -0
  68. package/dist/domains/tickets.d.ts.map +1 -0
  69. package/dist/domains/tickets.js +533 -0
  70. package/dist/domains/tickets.js.map +1 -0
  71. package/dist/domains/time.d.ts +4 -0
  72. package/dist/domains/time.d.ts.map +1 -0
  73. package/dist/domains/time.js +93 -0
  74. package/dist/domains/time.js.map +1 -0
  75. package/dist/index.d.ts +3 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +137 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/server.d.ts +5 -0
  80. package/dist/server.d.ts.map +1 -0
  81. package/dist/server.js +183 -0
  82. package/dist/server.js.map +1 -0
  83. package/dist/session.d.ts +12 -0
  84. package/dist/session.d.ts.map +1 -0
  85. package/dist/session.js +31 -0
  86. package/dist/session.js.map +1 -0
  87. package/dist/types.d.ts +46 -0
  88. package/dist/types.d.ts.map +1 -0
  89. package/dist/types.js +44 -0
  90. package/dist/types.js.map +1 -0
  91. package/dist/utils/pagination.d.ts +12 -0
  92. package/dist/utils/pagination.d.ts.map +1 -0
  93. package/dist/utils/pagination.js +18 -0
  94. package/dist/utils/pagination.js.map +1 -0
  95. package/dist/utils/rate-limiter.d.ts +15 -0
  96. package/dist/utils/rate-limiter.d.ts.map +1 -0
  97. package/dist/utils/rate-limiter.js +63 -0
  98. package/dist/utils/rate-limiter.js.map +1 -0
  99. package/dist/utils/validators.d.ts +9 -0
  100. package/dist/utils/validators.d.ts.map +1 -0
  101. package/dist/utils/validators.js +59 -0
  102. package/dist/utils/validators.js.map +1 -0
  103. package/dist/utils/version-check.d.ts +7 -0
  104. package/dist/utils/version-check.d.ts.map +1 -0
  105. package/dist/utils/version-check.js +59 -0
  106. package/dist/utils/version-check.js.map +1 -0
  107. package/manifest.json +64 -0
  108. package/package.json +57 -0
@@ -0,0 +1,93 @@
1
+ import { jsonResult } from "../types.js";
2
+ import { optionalString, optionalNumber, optionalBoolean, pickDefined } from "../utils/validators.js";
3
+ export function createDomain(client) {
4
+ const tools = [
5
+ {
6
+ definition: {
7
+ name: "time_list_timers",
8
+ description: "List ticket timers (active/running timers across tickets)",
9
+ inputSchema: {
10
+ type: "object",
11
+ properties: { page: { type: "number", description: "Page number" } },
12
+ },
13
+ },
14
+ handler: async (args) => {
15
+ const params = pickDefined({ page: optionalNumber(args.page) });
16
+ return jsonResult(await client.get("/ticket_timers", params));
17
+ },
18
+ },
19
+ {
20
+ definition: {
21
+ name: "time_update_timer",
22
+ description: "Update a ticket timer (e.g., start/stop, change notes)",
23
+ inputSchema: {
24
+ type: "object",
25
+ properties: {
26
+ id: { type: "number", description: "Timer ID (required)" },
27
+ },
28
+ required: ["id"],
29
+ },
30
+ },
31
+ handler: async (args) => {
32
+ const id = args.id;
33
+ return jsonResult(await client.patch(`/ticket_timers/${id}`));
34
+ },
35
+ },
36
+ {
37
+ definition: {
38
+ name: "time_list_timelogs",
39
+ description: "List employee time logs (clock in/out records)",
40
+ inputSchema: {
41
+ type: "object",
42
+ properties: {
43
+ user_id: { type: "number", description: "Filter by user ID" },
44
+ page: { type: "number", description: "Page number" },
45
+ },
46
+ },
47
+ },
48
+ handler: async (args) => {
49
+ const params = pickDefined({
50
+ user_id: optionalNumber(args.user_id),
51
+ page: optionalNumber(args.page),
52
+ });
53
+ return jsonResult(await client.get("/timelogs", params));
54
+ },
55
+ },
56
+ {
57
+ definition: {
58
+ name: "time_update_timelog",
59
+ description: "Update a time log entry (clock in/out, lunch, notes)",
60
+ inputSchema: {
61
+ type: "object",
62
+ properties: {
63
+ lunch: { type: "boolean", description: "Lunch break" },
64
+ in_at: { type: "string", description: "Clock-in time (ISO 8601)" },
65
+ out_at: { type: "string", description: "Clock-out time (ISO 8601)" },
66
+ in_note: { type: "string", description: "Clock-in note" },
67
+ out_note: { type: "string", description: "Clock-out note" },
68
+ },
69
+ },
70
+ },
71
+ handler: async (args) => {
72
+ const body = pickDefined({
73
+ lunch: optionalBoolean(args.lunch),
74
+ in_at: optionalString(args.in_at),
75
+ out_at: optionalString(args.out_at),
76
+ in_note: optionalString(args.in_note),
77
+ out_note: optionalString(args.out_note),
78
+ });
79
+ return jsonResult(await client.put("/timelogs", body));
80
+ },
81
+ },
82
+ {
83
+ definition: {
84
+ name: "time_get_last_timelog",
85
+ description: "Get the most recent time log entry for the current user",
86
+ inputSchema: { type: "object", properties: {} },
87
+ },
88
+ handler: async () => jsonResult(await client.get("/timelogs/last")),
89
+ },
90
+ ];
91
+ return { name: "time", description: "Ticket timers and employee time logs", getTools: () => tools };
92
+ }
93
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../../src/domains/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { SyncroApiClient } from "./api-client.js";
4
+ import { createServer } from "./server.js";
5
+ import { checkForUpdates } from "./utils/version-check.js";
6
+ // Non-blocking update check on startup
7
+ checkForUpdates();
8
+ const apiKey = process.env.SYNCRO_API_KEY;
9
+ const subdomain = process.env.SYNCRO_SUBDOMAIN;
10
+ if (!apiKey || !subdomain) {
11
+ console.error("Missing required environment variables:\n" +
12
+ " SYNCRO_API_KEY - Your Syncro API key (Admin > API Tokens)\n" +
13
+ " SYNCRO_SUBDOMAIN - Your Syncro subdomain (e.g., 'mycompany' from mycompany.syncromsp.com)");
14
+ process.exit(1);
15
+ }
16
+ // Tool mode: "flat" registers all 170 tools at startup (works everywhere).
17
+ // "navigation" uses lazy-loaded domains (lower token usage, requires client
18
+ // support for notifications/tools/list_changed).
19
+ // Default: "flat" for maximum compatibility.
20
+ const toolMode = (process.env.MCP_TOOL_MODE || "flat");
21
+ const client = new SyncroApiClient({ apiKey, subdomain });
22
+ const mcpServer = createServer(client, toolMode);
23
+ const transport = process.env.MCP_TRANSPORT || "stdio";
24
+ if (transport === "http") {
25
+ const { default: express } = await import("express");
26
+ const { randomUUID } = await import("node:crypto");
27
+ const { StreamableHTTPServerTransport } = await import("@modelcontextprotocol/sdk/server/streamableHttp.js");
28
+ const { isInitializeRequest } = await import("@modelcontextprotocol/sdk/types.js");
29
+ const port = parseInt(process.env.MCP_PORT || "8080", 10);
30
+ const useAuth = process.env.MCP_AUTH !== "false";
31
+ const baseUrl = process.env.MCP_BASE_URL || `http://localhost:${port}`;
32
+ const mcpServerUrl = new URL(baseUrl);
33
+ const app = express();
34
+ app.use(express.json());
35
+ // Health check (always unauthenticated)
36
+ app.get("/health", (_req, res) => {
37
+ res.json({ status: "ok", transport: "http", auth: useAuth });
38
+ });
39
+ let authMiddleware;
40
+ if (useAuth) {
41
+ const { McpOAuthProvider } = await import("./auth.js");
42
+ const { mcpAuthRouter } = await import("@modelcontextprotocol/sdk/server/auth/router.js");
43
+ const { requireBearerAuth } = await import("@modelcontextprotocol/sdk/server/auth/middleware/bearerAuth.js");
44
+ const { getOAuthProtectedResourceMetadataUrl } = await import("@modelcontextprotocol/sdk/server/auth/router.js");
45
+ const oauthProvider = new McpOAuthProvider();
46
+ // Install OAuth routes (/.well-known/*, /authorize, /token, /register, /revoke)
47
+ app.use(mcpAuthRouter({
48
+ provider: oauthProvider,
49
+ issuerUrl: mcpServerUrl,
50
+ scopesSupported: ["mcp:tools"],
51
+ }));
52
+ authMiddleware = requireBearerAuth({
53
+ verifier: oauthProvider,
54
+ requiredScopes: [],
55
+ resourceMetadataUrl: getOAuthProtectedResourceMetadataUrl(mcpServerUrl),
56
+ });
57
+ console.error(`OAuth enabled. Issuer: ${mcpServerUrl}`);
58
+ }
59
+ else {
60
+ console.error("Auth disabled (MCP_AUTH=false)");
61
+ }
62
+ // Session management
63
+ const transports = {};
64
+ const mcpHandler = async (req, res) => {
65
+ const sessionId = req.headers["mcp-session-id"];
66
+ try {
67
+ let sessionTransport;
68
+ if (sessionId && transports[sessionId]) {
69
+ sessionTransport = transports[sessionId];
70
+ }
71
+ else if (!sessionId && isInitializeRequest(req.body)) {
72
+ sessionTransport = new StreamableHTTPServerTransport({
73
+ sessionIdGenerator: () => randomUUID(),
74
+ onsessioninitialized: (sid) => {
75
+ transports[sid] = sessionTransport;
76
+ },
77
+ });
78
+ sessionTransport.onclose = () => {
79
+ const sid = sessionTransport.sessionId;
80
+ if (sid)
81
+ delete transports[sid];
82
+ };
83
+ await mcpServer.connect(sessionTransport);
84
+ }
85
+ else {
86
+ res.status(400).json({ error: "Bad request: missing session ID or not an init request" });
87
+ return;
88
+ }
89
+ await sessionTransport.handleRequest(req, res, req.body);
90
+ }
91
+ catch (error) {
92
+ console.error("MCP handler error:", error);
93
+ if (!res.headersSent) {
94
+ res.status(500).json({ error: "Internal server error" });
95
+ }
96
+ }
97
+ };
98
+ // Wire up MCP endpoints with optional auth
99
+ if (authMiddleware) {
100
+ app.post("/mcp", authMiddleware, mcpHandler);
101
+ app.get("/mcp", authMiddleware, mcpHandler);
102
+ app.delete("/mcp", authMiddleware, mcpHandler);
103
+ }
104
+ else {
105
+ app.post("/mcp", mcpHandler);
106
+ app.get("/mcp", mcpHandler);
107
+ app.delete("/mcp", mcpHandler);
108
+ }
109
+ app.listen(port, () => {
110
+ console.error(`SyncroMSP MCP server listening on http://0.0.0.0:${port}`);
111
+ console.error(`Health: http://0.0.0.0:${port}/health`);
112
+ console.error(`MCP: ${baseUrl}/mcp`);
113
+ if (useAuth) {
114
+ console.error(`OAuth metadata: ${baseUrl}/.well-known/oauth-authorization-server`);
115
+ }
116
+ });
117
+ const shutdown = () => {
118
+ for (const t of Object.values(transports)) {
119
+ t.close();
120
+ }
121
+ process.exit(0);
122
+ };
123
+ process.on("SIGINT", shutdown);
124
+ process.on("SIGTERM", shutdown);
125
+ }
126
+ else {
127
+ // Default: stdio transport
128
+ const stdioTransport = new StdioServerTransport();
129
+ await mcpServer.connect(stdioTransport);
130
+ const shutdown = async () => {
131
+ await mcpServer.close();
132
+ process.exit(0);
133
+ };
134
+ process.on("SIGINT", shutdown);
135
+ process.on("SIGTERM", shutdown);
136
+ }
137
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { SyncroApiClient } from "./api-client.js";
3
+ export type ToolMode = "navigation" | "flat";
4
+ export declare function createServer(client: SyncroApiClient, toolMode?: ToolMode): Server;
5
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAMnE,OAAO,EAAE,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAkBlE,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,MAAM,CAAC;AAE7C,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,QAAQ,GAAE,QAAuB,GAChC,MAAM,CAuPR"}
package/dist/server.js ADDED
@@ -0,0 +1,183 @@
1
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
2
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
3
+ import { SyncroApiError } from "./api-client.js";
4
+ import { loadDomain } from "./domains/index.js";
5
+ import { getSession, navigateTo, navigateBack, setSession, getDefaultSessionId, } from "./session.js";
6
+ import { DOMAIN_NAMES, DOMAIN_DESCRIPTIONS, textResult, errorResult, } from "./types.js";
7
+ export function createServer(client, toolMode = "navigation") {
8
+ const server = new Server({ name: "syncromsp-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
9
+ // Cache for domain tools keyed by domain name
10
+ const domainToolsCache = new Map();
11
+ async function getDomainTools(domain) {
12
+ const cached = domainToolsCache.get(domain);
13
+ if (cached)
14
+ return cached;
15
+ const handler = await loadDomain(domain, client);
16
+ const tools = handler.getTools();
17
+ domainToolsCache.set(domain, tools);
18
+ return tools;
19
+ }
20
+ // All domain tools flattened (populated on first ListTools in flat mode)
21
+ let allToolsCache = null;
22
+ async function getAllTools() {
23
+ if (allToolsCache)
24
+ return allToolsCache;
25
+ const all = [];
26
+ for (const domain of DOMAIN_NAMES) {
27
+ const tools = await getDomainTools(domain);
28
+ all.push(...tools);
29
+ }
30
+ allToolsCache = all;
31
+ return all;
32
+ }
33
+ // Build a lookup map for tool handlers (populated lazily)
34
+ const toolHandlerMap = new Map();
35
+ async function ensureToolMap() {
36
+ if (toolHandlerMap.size > 0)
37
+ return;
38
+ const all = await getAllTools();
39
+ for (const tool of all) {
40
+ toolHandlerMap.set(tool.definition.name, tool);
41
+ }
42
+ }
43
+ if (toolMode === "flat") {
44
+ // ===== FLAT MODE: All tools registered at startup =====
45
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
46
+ const allTools = await getAllTools();
47
+ return { tools: allTools.map((t) => t.definition) };
48
+ });
49
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
50
+ const { name, arguments: args = {} } = request.params;
51
+ try {
52
+ await ensureToolMap();
53
+ const tool = toolHandlerMap.get(name);
54
+ if (!tool) {
55
+ return errorResult(`Unknown tool: ${name}. Use a tool from the available list.`);
56
+ }
57
+ return await tool.handler(args);
58
+ }
59
+ catch (error) {
60
+ if (error instanceof SyncroApiError) {
61
+ return errorResult(error.message);
62
+ }
63
+ const message = error instanceof Error ? error.message : String(error);
64
+ return errorResult(message);
65
+ }
66
+ });
67
+ }
68
+ else {
69
+ // ===== NAVIGATION MODE: Lazy-loaded domain tools =====
70
+ const navigationTools = [
71
+ {
72
+ name: "syncro_navigate",
73
+ description: "Navigate to a SyncroMSP domain to access its tools. Available domains: " +
74
+ DOMAIN_NAMES.map((d) => `${d} (${DOMAIN_DESCRIPTIONS[d]})`).join(", "),
75
+ inputSchema: {
76
+ type: "object",
77
+ properties: {
78
+ domain: {
79
+ type: "string",
80
+ enum: [...DOMAIN_NAMES],
81
+ description: "The domain to navigate to",
82
+ },
83
+ },
84
+ required: ["domain"],
85
+ },
86
+ },
87
+ {
88
+ name: "syncro_status",
89
+ description: "Show current navigation state and available SyncroMSP domains",
90
+ inputSchema: { type: "object", properties: {} },
91
+ },
92
+ {
93
+ name: "syncro_back",
94
+ description: "Return to the root domain list from the current domain",
95
+ inputSchema: { type: "object", properties: {} },
96
+ },
97
+ ];
98
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
99
+ const sessionId = getDefaultSessionId();
100
+ const session = getSession(sessionId);
101
+ if (!session.currentDomain) {
102
+ return { tools: navigationTools };
103
+ }
104
+ const domainTools = await getDomainTools(session.currentDomain);
105
+ const backTool = navigationTools.find((t) => t.name === "syncro_back");
106
+ return {
107
+ tools: [...domainTools.map((t) => t.definition), backTool],
108
+ };
109
+ });
110
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
111
+ const { name, arguments: args = {} } = request.params;
112
+ const sessionId = getDefaultSessionId();
113
+ try {
114
+ // Handle navigation tools
115
+ if (name === "syncro_navigate") {
116
+ const domain = args.domain;
117
+ if (!DOMAIN_NAMES.includes(domain)) {
118
+ return errorResult(`Unknown domain: ${domain}. Available: ${DOMAIN_NAMES.join(", ")}`);
119
+ }
120
+ const newState = navigateTo(sessionId, domain);
121
+ setSession(sessionId, newState);
122
+ const tools = await getDomainTools(domain);
123
+ await server.notification({
124
+ method: "notifications/tools/list_changed",
125
+ });
126
+ return textResult(`Navigated to ${domain} domain. Available tools:\n` +
127
+ tools
128
+ .map((t) => ` - ${t.definition.name}: ${t.definition.description}`)
129
+ .join("\n"));
130
+ }
131
+ if (name === "syncro_status") {
132
+ const session = getSession(sessionId);
133
+ if (session.currentDomain) {
134
+ const tools = await getDomainTools(session.currentDomain);
135
+ return textResult(`Current domain: ${session.currentDomain}\n\nAvailable tools:\n` +
136
+ tools
137
+ .map((t) => ` - ${t.definition.name}: ${t.definition.description}`)
138
+ .join("\n") +
139
+ `\n\nUse syncro_back to return to domain list.`);
140
+ }
141
+ return textResult("Not in any domain. Available domains:\n" +
142
+ DOMAIN_NAMES.map((d) => ` - ${d}: ${DOMAIN_DESCRIPTIONS[d]}`).join("\n") +
143
+ "\n\nUse syncro_navigate to enter a domain.");
144
+ }
145
+ if (name === "syncro_back") {
146
+ const session = getSession(sessionId);
147
+ if (!session.currentDomain) {
148
+ return textResult("Already at root. Use syncro_navigate to enter a domain.");
149
+ }
150
+ const prev = session.currentDomain;
151
+ const newState = navigateBack(sessionId);
152
+ setSession(sessionId, newState);
153
+ await server.notification({
154
+ method: "notifications/tools/list_changed",
155
+ });
156
+ return textResult(`Left ${prev} domain. Available domains:\n` +
157
+ DOMAIN_NAMES.map((d) => ` - ${d}: ${DOMAIN_DESCRIPTIONS[d]}`).join("\n"));
158
+ }
159
+ // Handle domain tools
160
+ const session = getSession(sessionId);
161
+ if (!session.currentDomain) {
162
+ return errorResult(`Unknown tool: ${name}. Use syncro_navigate to enter a domain first.`);
163
+ }
164
+ const domainTools = await getDomainTools(session.currentDomain);
165
+ const tool = domainTools.find((t) => t.definition.name === name);
166
+ if (!tool) {
167
+ return errorResult(`Unknown tool: ${name} in domain ${session.currentDomain}. ` +
168
+ `Available: ${domainTools.map((t) => t.definition.name).join(", ")}`);
169
+ }
170
+ return await tool.handler(args);
171
+ }
172
+ catch (error) {
173
+ if (error instanceof SyncroApiError) {
174
+ return errorResult(error.message);
175
+ }
176
+ const message = error instanceof Error ? error.message : String(error);
177
+ return errorResult(message);
178
+ }
179
+ });
180
+ }
181
+ return server;
182
+ }
183
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DomainName } from "./types.js";
2
+ export interface SessionState {
3
+ currentDomain: DomainName | null;
4
+ }
5
+ export declare function getSession(sessionId: string): SessionState;
6
+ export declare function navigateTo(sessionId: string, domain: DomainName): SessionState;
7
+ export declare function navigateBack(sessionId: string): SessionState;
8
+ export declare function setSession(sessionId: string, state: SessionState): void;
9
+ export declare function removeSession(sessionId: string): void;
10
+ export declare function getDefaultSessionId(): string;
11
+ export declare function setDefaultSessionId(id: string): void;
12
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,UAAU,GAAG,IAAI,CAAC;CAClC;AAID,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAO1D;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,YAAY,CAG9E;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,CAG5D;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAEvE;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAErD;AAID,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAEpD"}
@@ -0,0 +1,31 @@
1
+ const sessions = new Map();
2
+ export function getSession(sessionId) {
3
+ let session = sessions.get(sessionId);
4
+ if (!session) {
5
+ session = { currentDomain: null };
6
+ sessions.set(sessionId, session);
7
+ }
8
+ return session;
9
+ }
10
+ export function navigateTo(sessionId, domain) {
11
+ const session = getSession(sessionId);
12
+ return { ...session, currentDomain: domain };
13
+ }
14
+ export function navigateBack(sessionId) {
15
+ const session = getSession(sessionId);
16
+ return { ...session, currentDomain: null };
17
+ }
18
+ export function setSession(sessionId, state) {
19
+ sessions.set(sessionId, state);
20
+ }
21
+ export function removeSession(sessionId) {
22
+ sessions.delete(sessionId);
23
+ }
24
+ let defaultSessionId = "default";
25
+ export function getDefaultSessionId() {
26
+ return defaultSessionId;
27
+ }
28
+ export function setDefaultSessionId(id) {
29
+ defaultSessionId = id;
30
+ }
31
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAMA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEjD,MAAM,UAAU,UAAU,CAAC,SAAiB;IAC1C,IAAI,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QAClC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,MAAkB;IAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACtC,OAAO,EAAE,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,KAAmB;IAC/D,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC7B,CAAC;AAED,IAAI,gBAAgB,GAAG,SAAS,CAAC;AAEjC,MAAM,UAAU,mBAAmB;IACjC,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAAU;IAC5C,gBAAgB,GAAG,EAAE,CAAC;AACxB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { Tool } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const DOMAIN_NAMES: readonly ["tickets", "customers", "assets", "contacts", "invoices", "estimates", "appointments", "products", "payments", "leads", "contracts", "rmm", "scheduling", "time", "admin"];
3
+ export type DomainName = (typeof DOMAIN_NAMES)[number];
4
+ export declare const DOMAIN_DESCRIPTIONS: Record<DomainName, string>;
5
+ export interface ToolResult {
6
+ [key: string]: unknown;
7
+ content: Array<{
8
+ type: "text";
9
+ text: string;
10
+ }>;
11
+ isError?: boolean;
12
+ }
13
+ export interface ToolHandler {
14
+ (args: Record<string, unknown>): Promise<ToolResult>;
15
+ }
16
+ export interface DomainTool {
17
+ definition: Tool;
18
+ handler: ToolHandler;
19
+ }
20
+ export interface DomainHandler {
21
+ readonly name: DomainName;
22
+ readonly description: string;
23
+ getTools(): DomainTool[];
24
+ }
25
+ export interface SyncroApiConfig {
26
+ readonly apiKey: string;
27
+ readonly subdomain: string;
28
+ }
29
+ export interface PaginatedResponse<T> {
30
+ data: T[];
31
+ meta?: {
32
+ total_entries?: number;
33
+ total_pages?: number;
34
+ page?: number;
35
+ per_page?: number;
36
+ };
37
+ }
38
+ export interface SyncroErrorResponse {
39
+ error?: string;
40
+ errors?: string[] | string | Record<string, string[]>;
41
+ message?: string;
42
+ }
43
+ export declare function textResult(text: string): ToolResult;
44
+ export declare function jsonResult(data: unknown): ToolResult;
45
+ export declare function errorResult(message: string): ToolResult;
46
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE/D,eAAO,MAAM,YAAY,sLAgBf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAiB1D,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACtD;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,IAAI,CAAC;IACjB,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,IAAI,UAAU,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,IAAI,CAAC,EAAE;QACL,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAEnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAEpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAEvD"}
package/dist/types.js ADDED
@@ -0,0 +1,44 @@
1
+ export const DOMAIN_NAMES = [
2
+ "tickets",
3
+ "customers",
4
+ "assets",
5
+ "contacts",
6
+ "invoices",
7
+ "estimates",
8
+ "appointments",
9
+ "products",
10
+ "payments",
11
+ "leads",
12
+ "contracts",
13
+ "rmm",
14
+ "scheduling",
15
+ "time",
16
+ "admin",
17
+ ];
18
+ export const DOMAIN_DESCRIPTIONS = {
19
+ tickets: "Service tickets, comments, line items, timers, attachments",
20
+ customers: "Customer records, phones, autocomplete",
21
+ assets: "Customer assets, patches, chat info",
22
+ contacts: "Customer contacts",
23
+ invoices: "Invoices, line items, print/email",
24
+ estimates: "Estimates, line items, print/email, convert to invoice",
25
+ appointments: "Appointments and appointment types",
26
+ products: "Products, serials, SKUs, categories, images, inventory",
27
+ payments: "Payments, payment methods, payment profiles",
28
+ leads: "Leads and opportunities",
29
+ contracts: "Service contracts and SLAs",
30
+ rmm: "RMM alerts",
31
+ scheduling: "Recurring invoice schedules and line items",
32
+ time: "Ticket timers and employee time logs",
33
+ admin: "Search, users, vendors, wiki, portal users, canned responses, settings, worksheets, devices, ticket forms",
34
+ };
35
+ export function textResult(text) {
36
+ return { content: [{ type: "text", text }] };
37
+ }
38
+ export function jsonResult(data) {
39
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
40
+ }
41
+ export function errorResult(message) {
42
+ return { content: [{ type: "text", text: `Error: ${message}` }], isError: true };
43
+ }
44
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,SAAS;IACT,WAAW;IACX,QAAQ;IACR,UAAU;IACV,UAAU;IACV,WAAW;IACX,cAAc;IACd,UAAU;IACV,UAAU;IACV,OAAO;IACP,WAAW;IACX,KAAK;IACL,YAAY;IACZ,MAAM;IACN,OAAO;CACC,CAAC;AAIX,MAAM,CAAC,MAAM,mBAAmB,GAA+B;IAC7D,OAAO,EAAE,4DAA4D;IACrE,SAAS,EAAE,wCAAwC;IACnD,MAAM,EAAE,qCAAqC;IAC7C,QAAQ,EAAE,mBAAmB;IAC7B,QAAQ,EAAE,mCAAmC;IAC7C,SAAS,EAAE,wDAAwD;IACnE,YAAY,EAAE,oCAAoC;IAClD,QAAQ,EAAE,wDAAwD;IAClE,QAAQ,EAAE,6CAA6C;IACvD,KAAK,EAAE,yBAAyB;IAChC,SAAS,EAAE,4BAA4B;IACvC,GAAG,EAAE,YAAY;IACjB,UAAU,EAAE,4CAA4C;IACxD,IAAI,EAAE,sCAAsC;IAC5C,KAAK,EACH,2GAA2G;CAC9G,CAAC;AA4CF,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAa;IACtC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AACnF,CAAC"}
@@ -0,0 +1,12 @@
1
+ export interface PaginationParams {
2
+ page?: number;
3
+ }
4
+ export declare function addPaginationParams(params: URLSearchParams, pagination?: PaginationParams): void;
5
+ export interface PaginationInfo {
6
+ page?: number;
7
+ total_pages?: number;
8
+ total_entries?: number;
9
+ per_page?: number;
10
+ }
11
+ export declare function formatPaginationInfo(meta: PaginationInfo | undefined): string;
12
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/utils/pagination.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,IAAI,CAIN;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAO7E"}