acuity-mcp-server 1.0.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 (99) hide show
  1. package/README.md +541 -0
  2. package/dist/auth/device-flow.d.ts +46 -0
  3. package/dist/auth/device-flow.d.ts.map +1 -0
  4. package/dist/auth/device-flow.js +141 -0
  5. package/dist/auth/device-flow.js.map +1 -0
  6. package/dist/auth/http-auth.d.ts +25 -0
  7. package/dist/auth/http-auth.d.ts.map +1 -0
  8. package/dist/auth/http-auth.js +101 -0
  9. package/dist/auth/http-auth.js.map +1 -0
  10. package/dist/auth/jwt-validator.d.ts +20 -0
  11. package/dist/auth/jwt-validator.d.ts.map +1 -0
  12. package/dist/auth/jwt-validator.js +83 -0
  13. package/dist/auth/jwt-validator.js.map +1 -0
  14. package/dist/auth/token-storage.d.ts +88 -0
  15. package/dist/auth/token-storage.d.ts.map +1 -0
  16. package/dist/auth/token-storage.js +273 -0
  17. package/dist/auth/token-storage.js.map +1 -0
  18. package/dist/clients/hasura-client.d.ts +33 -0
  19. package/dist/clients/hasura-client.d.ts.map +1 -0
  20. package/dist/clients/hasura-client.js +79 -0
  21. package/dist/clients/hasura-client.js.map +1 -0
  22. package/dist/config/environments.d.ts +51 -0
  23. package/dist/config/environments.d.ts.map +1 -0
  24. package/dist/config/environments.js +183 -0
  25. package/dist/config/environments.js.map +1 -0
  26. package/dist/index.d.ts +7 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +593 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/server/http-server.d.ts +14 -0
  31. package/dist/server/http-server.d.ts.map +1 -0
  32. package/dist/server/http-server.js +167 -0
  33. package/dist/server/http-server.js.map +1 -0
  34. package/dist/server/mcp-core.d.ts +12 -0
  35. package/dist/server/mcp-core.d.ts.map +1 -0
  36. package/dist/server/mcp-core.js +200 -0
  37. package/dist/server/mcp-core.js.map +1 -0
  38. package/dist/tools/acuity-init.d.ts +84 -0
  39. package/dist/tools/acuity-init.d.ts.map +1 -0
  40. package/dist/tools/acuity-init.js +239 -0
  41. package/dist/tools/acuity-init.js.map +1 -0
  42. package/dist/tools/get-dashboard-summary.d.ts +96 -0
  43. package/dist/tools/get-dashboard-summary.d.ts.map +1 -0
  44. package/dist/tools/get-dashboard-summary.js +264 -0
  45. package/dist/tools/get-dashboard-summary.js.map +1 -0
  46. package/dist/tools/get-issue.d.ts +62 -0
  47. package/dist/tools/get-issue.d.ts.map +1 -0
  48. package/dist/tools/get-issue.js +150 -0
  49. package/dist/tools/get-issue.js.map +1 -0
  50. package/dist/tools/get-lesson-learned.d.ts +53 -0
  51. package/dist/tools/get-lesson-learned.d.ts.map +1 -0
  52. package/dist/tools/get-lesson-learned.js +117 -0
  53. package/dist/tools/get-lesson-learned.js.map +1 -0
  54. package/dist/tools/get-lookup-values.d.ts +41 -0
  55. package/dist/tools/get-lookup-values.d.ts.map +1 -0
  56. package/dist/tools/get-lookup-values.js +127 -0
  57. package/dist/tools/get-lookup-values.js.map +1 -0
  58. package/dist/tools/get-project.d.ts +131 -0
  59. package/dist/tools/get-project.d.ts.map +1 -0
  60. package/dist/tools/get-project.js +340 -0
  61. package/dist/tools/get-project.js.map +1 -0
  62. package/dist/tools/get-risk.d.ts +65 -0
  63. package/dist/tools/get-risk.d.ts.map +1 -0
  64. package/dist/tools/get-risk.js +173 -0
  65. package/dist/tools/get-risk.js.map +1 -0
  66. package/dist/tools/get-status-reports.d.ts +46 -0
  67. package/dist/tools/get-status-reports.d.ts.map +1 -0
  68. package/dist/tools/get-status-reports.js +151 -0
  69. package/dist/tools/get-status-reports.js.map +1 -0
  70. package/dist/tools/init-auth.d.ts +47 -0
  71. package/dist/tools/init-auth.d.ts.map +1 -0
  72. package/dist/tools/init-auth.js +213 -0
  73. package/dist/tools/init-auth.js.map +1 -0
  74. package/dist/tools/list-issues.d.ts +134 -0
  75. package/dist/tools/list-issues.d.ts.map +1 -0
  76. package/dist/tools/list-issues.js +285 -0
  77. package/dist/tools/list-issues.js.map +1 -0
  78. package/dist/tools/list-lessons-learned.d.ts +79 -0
  79. package/dist/tools/list-lessons-learned.d.ts.map +1 -0
  80. package/dist/tools/list-lessons-learned.js +155 -0
  81. package/dist/tools/list-lessons-learned.js.map +1 -0
  82. package/dist/tools/list-projects.d.ts +200 -0
  83. package/dist/tools/list-projects.d.ts.map +1 -0
  84. package/dist/tools/list-projects.js +396 -0
  85. package/dist/tools/list-projects.js.map +1 -0
  86. package/dist/tools/list-risks.d.ts +166 -0
  87. package/dist/tools/list-risks.d.ts.map +1 -0
  88. package/dist/tools/list-risks.js +356 -0
  89. package/dist/tools/list-risks.js.map +1 -0
  90. package/dist/tools/search-projects.d.ts +90 -0
  91. package/dist/tools/search-projects.d.ts.map +1 -0
  92. package/dist/tools/search-projects.js +191 -0
  93. package/dist/tools/search-projects.js.map +1 -0
  94. package/dist/utils/formatters.d.ts +12 -0
  95. package/dist/utils/formatters.d.ts.map +1 -0
  96. package/dist/utils/formatters.js +28 -0
  97. package/dist/utils/formatters.js.map +1 -0
  98. package/openapi.yaml +194 -0
  99. package/package.json +68 -0
@@ -0,0 +1,167 @@
1
+ /**
2
+ * HTTP Server for Acuity MCP
3
+ * Implements Streamable HTTP transport for remote clients (Copilot, Claude, etc.)
4
+ */
5
+ import express from 'express';
6
+ import { randomUUID } from 'node:crypto';
7
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
8
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
9
+ import { validateHttpAuth } from '../auth/http-auth.js';
10
+ import { createMcpServer } from './mcp-core.js';
11
+ // Store active sessions
12
+ const sessions = new Map();
13
+ // Session timeout (30 minutes)
14
+ const SESSION_TIMEOUT_MS = 30 * 60 * 1000;
15
+ /**
16
+ * Clean up expired sessions periodically
17
+ */
18
+ function startSessionCleanup() {
19
+ setInterval(() => {
20
+ const now = Date.now();
21
+ for (const [sessionId, session] of sessions.entries()) {
22
+ if (now - session.createdAt.getTime() > SESSION_TIMEOUT_MS) {
23
+ console.log(`[HTTP] Cleaning up expired session: ${sessionId}`);
24
+ session.transport.close();
25
+ sessions.delete(sessionId);
26
+ }
27
+ }
28
+ }, 60000); // Check every minute
29
+ }
30
+ /**
31
+ * Create and configure Express app for MCP HTTP server
32
+ */
33
+ export function createHttpServer() {
34
+ const app = express();
35
+ // Parse JSON bodies
36
+ app.use(express.json());
37
+ // Health check endpoint (no auth required)
38
+ app.get('/health', (_req, res) => {
39
+ res.json({
40
+ status: 'ok',
41
+ service: 'acuity-mcp-server',
42
+ activeSessions: sessions.size
43
+ });
44
+ });
45
+ // OpenAPI schema endpoint (no auth required)
46
+ app.get('/openapi.yaml', (_req, res) => {
47
+ res.sendFile('openapi.yaml', { root: process.cwd() });
48
+ });
49
+ // MCP endpoint - POST (handle requests)
50
+ app.post('/mcp', validateHttpAuth, async (req, res) => {
51
+ const authReq = req;
52
+ const sessionId = req.headers['mcp-session-id'];
53
+ try {
54
+ let session = sessionId ? sessions.get(sessionId) : undefined;
55
+ if (session) {
56
+ // Reuse existing session
57
+ await session.transport.handleRequest(req, res, req.body);
58
+ }
59
+ else if (!sessionId && isInitializeRequest(req.body)) {
60
+ // Create new session
61
+ const newSessionId = randomUUID();
62
+ const transport = new StreamableHTTPServerTransport({
63
+ sessionIdGenerator: () => newSessionId,
64
+ onsessioninitialized: (id) => {
65
+ console.log(`[HTTP] Session initialized: ${id} for user: ${authReq.userEmail}`);
66
+ }
67
+ });
68
+ // Create MCP server instance for this session
69
+ const server = createMcpServer(authReq.userEmail, authReq.userToken);
70
+ // Store session
71
+ sessions.set(newSessionId, {
72
+ transport,
73
+ server,
74
+ email: authReq.userEmail,
75
+ createdAt: new Date()
76
+ });
77
+ // Handle transport close
78
+ transport.onclose = () => {
79
+ console.log(`[HTTP] Transport closed for session: ${newSessionId}`);
80
+ sessions.delete(newSessionId);
81
+ };
82
+ // Connect server to transport
83
+ await server.connect(transport);
84
+ // Handle the initialize request
85
+ await transport.handleRequest(req, res, req.body);
86
+ }
87
+ else {
88
+ // Invalid request - no session and not an initialize request
89
+ res.status(400).json({
90
+ jsonrpc: '2.0',
91
+ error: {
92
+ code: -32000,
93
+ message: 'Invalid session. Send initialize request first or include valid mcp-session-id header.'
94
+ },
95
+ id: null
96
+ });
97
+ }
98
+ }
99
+ catch (error) {
100
+ console.error('[HTTP] Error handling POST /mcp:', error);
101
+ res.status(500).json({
102
+ jsonrpc: '2.0',
103
+ error: {
104
+ code: -32603,
105
+ message: error instanceof Error ? error.message : 'Internal error'
106
+ },
107
+ id: null
108
+ });
109
+ }
110
+ });
111
+ // MCP endpoint - GET (SSE stream for server-to-client messages)
112
+ app.get('/mcp', validateHttpAuth, async (req, res) => {
113
+ const sessionId = req.headers['mcp-session-id'];
114
+ const session = sessions.get(sessionId);
115
+ if (!session) {
116
+ res.status(400).json({
117
+ jsonrpc: '2.0',
118
+ error: { code: -32000, message: 'Invalid or missing session' },
119
+ id: null
120
+ });
121
+ return;
122
+ }
123
+ await session.transport.handleRequest(req, res);
124
+ });
125
+ // MCP endpoint - DELETE (close session)
126
+ app.delete('/mcp', validateHttpAuth, async (req, res) => {
127
+ const sessionId = req.headers['mcp-session-id'];
128
+ const session = sessions.get(sessionId);
129
+ if (session) {
130
+ await session.transport.handleRequest(req, res);
131
+ sessions.delete(sessionId);
132
+ console.log(`[HTTP] Session deleted: ${sessionId}`);
133
+ }
134
+ else {
135
+ res.status(400).json({
136
+ jsonrpc: '2.0',
137
+ error: { code: -32000, message: 'Invalid or missing session' },
138
+ id: null
139
+ });
140
+ }
141
+ });
142
+ // Error handling middleware
143
+ app.use((err, _req, res, _next) => {
144
+ console.error('[HTTP] Unhandled error:', err);
145
+ res.status(500).json({
146
+ jsonrpc: '2.0',
147
+ error: { code: -32603, message: 'Internal server error' },
148
+ id: null
149
+ });
150
+ });
151
+ // Start session cleanup
152
+ startSessionCleanup();
153
+ return app;
154
+ }
155
+ /**
156
+ * Start HTTP server on specified port
157
+ */
158
+ export async function startHttpServer(port) {
159
+ const app = createHttpServer();
160
+ app.listen(port, () => {
161
+ console.log(`[HTTP] Acuity MCP Server listening on port ${port}`);
162
+ console.log(`[HTTP] MCP endpoint: http://localhost:${port}/mcp`);
163
+ console.log(`[HTTP] Health check: http://localhost:${port}/health`);
164
+ console.log(`[HTTP] OpenAPI schema: http://localhost:${port}/openapi.yaml`);
165
+ });
166
+ }
167
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/server/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP Server Core
3
+ * Shared MCP server logic used by both stdio and HTTP transports
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ /**
7
+ * Create MCP server instance with all tools configured
8
+ * For HTTP mode: email and token are provided from HTTP auth
9
+ * For stdio mode: email and token are retrieved from keychain/env
10
+ */
11
+ export declare function createMcpServer(userEmail: string, userToken: string): Server;
12
+ //# sourceMappingURL=mcp-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-core.d.ts","sourceRoot":"","sources":["../../src/server/mcp-core.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAoBnE;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CA2OR"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * MCP Server Core
3
+ * Shared MCP server logic used by both stdio and HTTP transports
4
+ */
5
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
6
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
7
+ import { HasuraClient } from '../clients/hasura-client.js';
8
+ import { acuityInit, acuityInitTool } from '../tools/acuity-init.js';
9
+ import { listProjects, listProjectsTool } from '../tools/list-projects.js';
10
+ import { getProject, getProjectTool } from '../tools/get-project.js';
11
+ import { getStatusReports, getStatusReportsTool } from '../tools/get-status-reports.js';
12
+ import { listRisks, listRisksTool } from '../tools/list-risks.js';
13
+ import { getRisk, getRiskTool } from '../tools/get-risk.js';
14
+ import { listIssues, listIssuesTool } from '../tools/list-issues.js';
15
+ import { getIssue, getIssueTool } from '../tools/get-issue.js';
16
+ import { listLessonsLearned, listLessonsLearnedTool } from '../tools/list-lessons-learned.js';
17
+ import { getLessonLearned, getLessonLearnedTool } from '../tools/get-lesson-learned.js';
18
+ import { getLookupValues, getLookupValuesTool } from '../tools/get-lookup-values.js';
19
+ import { searchProjects, searchProjectsTool } from '../tools/search-projects.js';
20
+ import { getDashboardSummary, getDashboardSummaryTool } from '../tools/get-dashboard-summary.js';
21
+ /**
22
+ * Create MCP server instance with all tools configured
23
+ * For HTTP mode: email and token are provided from HTTP auth
24
+ * For stdio mode: email and token are retrieved from keychain/env
25
+ */
26
+ export function createMcpServer(userEmail, userToken) {
27
+ // Create Hasura client for this user
28
+ const hasuraClient = HasuraClient.forUser(userEmail, userToken);
29
+ // Session state for this server instance
30
+ let sessionInitData = null;
31
+ // Create server instance
32
+ const server = new Server({
33
+ name: 'acuity-mcp-server',
34
+ version: '1.0.0'
35
+ }, {
36
+ capabilities: {
37
+ tools: {}
38
+ }
39
+ });
40
+ /**
41
+ * List available tools
42
+ * Note: For HTTP mode, we don't expose auth tools (acuity_login, acuity_logout, acuity_auth_status)
43
+ * because authentication is handled via HTTP headers
44
+ */
45
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
46
+ return {
47
+ tools: [
48
+ acuityInitTool,
49
+ listProjectsTool,
50
+ getProjectTool,
51
+ searchProjectsTool,
52
+ getStatusReportsTool,
53
+ listRisksTool,
54
+ getRiskTool,
55
+ listIssuesTool,
56
+ getIssueTool,
57
+ listLessonsLearnedTool,
58
+ getLessonLearnedTool,
59
+ getLookupValuesTool,
60
+ getDashboardSummaryTool
61
+ ]
62
+ };
63
+ });
64
+ /**
65
+ * Handle tool execution
66
+ */
67
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
68
+ const { name } = request.params;
69
+ try {
70
+ // Helper: auto-initialize if needed
71
+ async function ensureInitialized() {
72
+ if (!sessionInitData) {
73
+ sessionInitData = await acuityInit(hasuraClient);
74
+ }
75
+ return sessionInitData;
76
+ }
77
+ switch (name) {
78
+ case 'acuity_init': {
79
+ // Always refresh on explicit call
80
+ sessionInitData = await acuityInit(hasuraClient);
81
+ const d = sessionInitData;
82
+ const summary = `✅ Acuity initialized
83
+
84
+ Company: ${d.company}
85
+ Currency: ${d.currency_code} (${d.currency_locale})
86
+
87
+ Data available:
88
+ • Projects: ${d.entities.projects.count} | Proposals: ${d.entities.proposals.count}
89
+ • Risks: ${d.entities.project_risks.count} (project) + ${d.entities.proposal_risks.count} (proposal)
90
+ • Issues: ${d.entities.project_issues.count} (project) + ${d.entities.proposal_issues.count} (proposal)
91
+ • Lessons: ${d.entities.lessons_learned.count}
92
+ • Status Reports: ${d.entities.status_reports.count}
93
+
94
+ Lookups: ${d.lookup_tables.departments} departments, ${d.lookup_tables.categories} categories, ${d.lookup_tables.lifecycles} lifecycles`;
95
+ return {
96
+ content: [{ type: 'text', text: summary }]
97
+ };
98
+ }
99
+ case 'list_projects': {
100
+ const initData = await ensureInitialized();
101
+ const listResult = await listProjects(request.params.arguments, hasuraClient);
102
+ const response = sessionInitData === initData && !request.params.arguments
103
+ ? { _context: initData, ...listResult }
104
+ : listResult;
105
+ return {
106
+ content: [{ type: 'text', text: JSON.stringify(response, null, 2) }]
107
+ };
108
+ }
109
+ case 'get_project': {
110
+ await ensureInitialized();
111
+ const projectResult = await getProject(request.params.arguments, hasuraClient);
112
+ return {
113
+ content: [{ type: 'text', text: JSON.stringify(projectResult, null, 2) }]
114
+ };
115
+ }
116
+ case 'search_projects': {
117
+ await ensureInitialized();
118
+ const searchResult = await searchProjects(request.params.arguments, hasuraClient);
119
+ return {
120
+ content: [{ type: 'text', text: JSON.stringify(searchResult, null, 2) }]
121
+ };
122
+ }
123
+ case 'get_status_reports': {
124
+ await ensureInitialized();
125
+ const statusReportsText = await getStatusReports(request.params.arguments, hasuraClient);
126
+ return {
127
+ content: [{ type: 'text', text: statusReportsText }]
128
+ };
129
+ }
130
+ case 'list_risks': {
131
+ await ensureInitialized();
132
+ const risksResult = await listRisks(request.params.arguments, hasuraClient);
133
+ return {
134
+ content: [{ type: 'text', text: JSON.stringify(risksResult, null, 2) }]
135
+ };
136
+ }
137
+ case 'get_risk': {
138
+ await ensureInitialized();
139
+ const riskResult = await getRisk(request.params.arguments, hasuraClient);
140
+ return {
141
+ content: [{ type: 'text', text: JSON.stringify(riskResult, null, 2) }]
142
+ };
143
+ }
144
+ case 'list_issues': {
145
+ await ensureInitialized();
146
+ const issuesResult = await listIssues(request.params.arguments, hasuraClient);
147
+ return {
148
+ content: [{ type: 'text', text: JSON.stringify(issuesResult, null, 2) }]
149
+ };
150
+ }
151
+ case 'get_issue': {
152
+ await ensureInitialized();
153
+ const issueResult = await getIssue(request.params.arguments, hasuraClient);
154
+ return {
155
+ content: [{ type: 'text', text: JSON.stringify(issueResult, null, 2) }]
156
+ };
157
+ }
158
+ case 'list_lessons_learned': {
159
+ await ensureInitialized();
160
+ const lessonsResult = await listLessonsLearned(request.params.arguments, hasuraClient);
161
+ return {
162
+ content: [{ type: 'text', text: JSON.stringify(lessonsResult, null, 2) }]
163
+ };
164
+ }
165
+ case 'get_lesson_learned': {
166
+ await ensureInitialized();
167
+ const lessonResult = await getLessonLearned(request.params.arguments, hasuraClient);
168
+ return {
169
+ content: [{ type: 'text', text: JSON.stringify(lessonResult, null, 2) }]
170
+ };
171
+ }
172
+ case 'get_lookup_values': {
173
+ await ensureInitialized();
174
+ const lookupResult = await getLookupValues(request.params.arguments, hasuraClient);
175
+ return {
176
+ content: [{ type: 'text', text: JSON.stringify(lookupResult, null, 2) }]
177
+ };
178
+ }
179
+ case 'get_dashboard_summary': {
180
+ await ensureInitialized();
181
+ const dashboardResult = await getDashboardSummary(request.params.arguments, hasuraClient);
182
+ return {
183
+ content: [{ type: 'text', text: JSON.stringify(dashboardResult, null, 2) }]
184
+ };
185
+ }
186
+ default:
187
+ throw new Error(`Unknown tool: ${name}`);
188
+ }
189
+ }
190
+ catch (error) {
191
+ const errorMessage = error instanceof Error ? error.message : String(error);
192
+ return {
193
+ content: [{ type: 'text', text: `Error: ${errorMessage}` }],
194
+ isError: true
195
+ };
196
+ }
197
+ });
198
+ return server;
199
+ }
200
+ //# sourceMappingURL=mcp-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-core.js","sourceRoot":"","sources":["../../src/server/mcp-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * MCP Tool: acuity_init
3
+ * Initializes LLM context with minimal schema information
4
+ *
5
+ * Returns:
6
+ * - Company name
7
+ * - Entity counts (projects, risks, issues, lessons_learned, status_reports)
8
+ * - All enum values for filtering
9
+ * - Lookup table counts
10
+ * - Available tools
11
+ *
12
+ * This tool should be called first to give LLM understanding of available data.
13
+ * Target size: ~700-800 tokens
14
+ */
15
+ import type { HasuraClient } from '../clients/hasura-client.js';
16
+ export interface AcuityInitResult {
17
+ company: string;
18
+ currency_code: string;
19
+ currency_locale: string;
20
+ entities: {
21
+ projects: {
22
+ count: number;
23
+ description: string;
24
+ filterable_by: string[];
25
+ has_counts: string[];
26
+ related: string[];
27
+ };
28
+ proposals: {
29
+ count: number;
30
+ description: string;
31
+ filterable_by: string[];
32
+ related: string[];
33
+ };
34
+ project_risks: {
35
+ count: number;
36
+ description: string;
37
+ filterable_by: string[];
38
+ };
39
+ proposal_risks: {
40
+ count: number;
41
+ description: string;
42
+ filterable_by: string[];
43
+ };
44
+ project_issues: {
45
+ count: number;
46
+ description: string;
47
+ filterable_by: string[];
48
+ };
49
+ proposal_issues: {
50
+ count: number;
51
+ description: string;
52
+ filterable_by: string[];
53
+ };
54
+ lessons_learned: {
55
+ count: number;
56
+ description: string;
57
+ filterable_by: string[];
58
+ };
59
+ status_reports: {
60
+ count: number;
61
+ description: string;
62
+ filterable_by: string[];
63
+ };
64
+ };
65
+ enums: Record<string, string[] | string>;
66
+ lookup_tables: Record<string, number>;
67
+ available_tools: string[];
68
+ }
69
+ /**
70
+ * Acuity init handler
71
+ */
72
+ export declare function acuityInit(hasuraClient: HasuraClient): Promise<AcuityInitResult>;
73
+ /**
74
+ * MCP tool definition for acuity_init
75
+ */
76
+ export declare const acuityInitTool: {
77
+ name: string;
78
+ description: string;
79
+ inputSchema: {
80
+ type: string;
81
+ properties: {};
82
+ };
83
+ };
84
+ //# sourceMappingURL=acuity-init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acuity-init.d.ts","sourceRoot":"","sources":["../../src/tools/acuity-init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IAExB,QAAQ,EAAE;QACR,QAAQ,EAAE;YACR,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,UAAU,EAAE,MAAM,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;YACxB,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,CAAC;QACF,aAAa,EAAE;YACb,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,eAAe,EAAE;YACf,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,eAAe,EAAE;YACf,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;QACF,cAAc,EAAE;YACd,KAAK,EAAE,MAAM,CAAC;YACd,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,EAAE,CAAC;SACzB,CAAC;KACH,CAAC;IAEF,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC;IAEzC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA8FD;;GAEG;AACH,wBAAsB,UAAU,CAC9B,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAoI3B;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;CAwB1B,CAAC"}