@atollhq/mcp-server 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/http.ts","../src/tools.ts","../src/api.ts"],"sourcesContent":["import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createAtollHttpServer } from './http.js';\nimport { createAtollMcpServer } from './tools.js';\n\nexport { AtollApiClient, resolveAuthToken, resolveOrgId } from './api.js';\nexport { createAtollHttpServer, extractBearerToken, handleMcpHttpRequest, healthResponse } from './http.js';\nexport { createAtollMcpServer, listAtollToolNames } from './tools.js';\n\nasync function main(): Promise<void> {\n const args = new Set(process.argv.slice(2));\n if (args.has('--stdio')) {\n const { server } = createAtollMcpServer();\n await server.connect(new StdioServerTransport());\n return;\n }\n\n const port = Number.parseInt(process.env.PORT ?? '8787', 10);\n const server = createAtollHttpServer();\n server.listen(port, () => {\n console.error(`atoll-mcp-server listening on http://127.0.0.1:${port}/mcp`);\n });\n}\n\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch((error) => {\n console.error(error);\n process.exit(1);\n });\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from 'node:http';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport type { AuthInfo } from '@modelcontextprotocol/sdk/server/auth/types.js';\nimport { createAtollMcpServer } from './tools.js';\n\nexport interface HealthResponse {\n status: number;\n headers: Record<string, string>;\n body: string;\n}\n\nexport function corsHeaders(): Record<string, string> {\n return {\n 'access-control-allow-origin': '*',\n 'access-control-allow-methods': 'GET,POST,OPTIONS',\n 'access-control-allow-headers': 'authorization,content-type,mcp-session-id,mcp-protocol-version',\n 'access-control-expose-headers': 'mcp-session-id',\n };\n}\n\nexport function extractBearerToken(header?: string): string | undefined {\n if (!header) return undefined;\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim());\n if (!match) {\n throw new Error('Authorization must use Bearer authentication. Example: Authorization: Bearer sk_atoll_...');\n }\n return match[1];\n}\n\nexport function healthResponse(): HealthResponse {\n return {\n status: 200,\n headers: { 'content-type': 'application/json', ...corsHeaders() },\n body: JSON.stringify({ ok: true, service: 'atoll-mcp-server' }),\n };\n}\n\nexport function preflightResponse(): HealthResponse {\n return {\n status: 204,\n headers: corsHeaders(),\n body: '',\n };\n}\n\nexport function writeJson(res: ServerResponse, status: number, payload: unknown): void {\n res.writeHead(status, { 'content-type': 'application/json', ...corsHeaders() });\n res.end(JSON.stringify(payload));\n}\n\nexport async function handleMcpHttpRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n if (req.method === 'OPTIONS') {\n const preflight = preflightResponse();\n res.writeHead(preflight.status, preflight.headers);\n res.end(preflight.body);\n return;\n }\n\n if (req.url === '/health' && req.method === 'GET') {\n const health = healthResponse();\n res.writeHead(health.status, health.headers);\n res.end(health.body);\n return;\n }\n\n if (req.url !== '/mcp') {\n writeJson(res, 404, { error: 'Not found. Use POST /mcp for MCP requests or GET /health.' });\n return;\n }\n\n if (req.method !== 'POST') {\n writeJson(res, 405, {\n jsonrpc: '2.0',\n error: { code: -32000, message: 'Method not allowed. Use POST /mcp.' },\n id: null,\n });\n return;\n }\n\n try {\n const token = extractBearerToken(req.headers.authorization);\n if (token) {\n (req as IncomingMessage & { auth?: AuthInfo }).auth = {\n token,\n clientId: 'atoll-mcp-client',\n scopes: [],\n };\n }\n\n const { server } = createAtollMcpServer();\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n await server.connect(transport);\n for (const [key, value] of Object.entries(corsHeaders())) {\n res.setHeader(key, value);\n }\n res.on('close', () => {\n void transport.close();\n void server.close();\n });\n await transport.handleRequest(req as IncomingMessage & { auth?: AuthInfo }, res);\n } catch (error) {\n if (!res.headersSent) {\n writeJson(res, 500, {\n jsonrpc: '2.0',\n error: {\n code: -32603,\n message: (error as Error).message,\n },\n id: null,\n });\n }\n }\n}\n\nexport function createAtollHttpServer() {\n return createServer((req, res) => {\n void handleMcpHttpRequest(req, res);\n });\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { z } from 'zod';\nimport { AtollApiClient, resolveAuthToken, resolveOrgId } from './api.js';\n\nconst VERSION = '0.1.0';\nexport const SUPPORTED_API_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const;\n\nexport const ATOLL_MCP_INSTRUCTIONS = `Atoll connects strategy to execution: goals -> KPIs -> initiatives -> milestones and issues.\nKPIs measure business outcomes; initiative targets measure initiative commitments. Use progress targets for output tracking and gate targets for launch prerequisites where KPI pacing would be misleading.\n\nUse atoll_get_heartbeat first to orient an agent, then inspect and update the highest-leverage work.\nRemote clients should pass Authorization: Bearer <ATOLL_API_KEY>. If org_id is omitted, the server uses ATOLL_ORG_ID or the only accessible org.`;\n\nexport const ATOLL_TOOL_NAMES = [\n 'atoll_get_auth_context',\n 'atoll_list_orgs',\n 'atoll_get_heartbeat',\n 'atoll_list_issues',\n 'atoll_get_issue',\n 'atoll_create_issue',\n 'atoll_update_issue',\n 'atoll_archive_issue',\n 'atoll_unarchive_issue',\n 'atoll_list_comments',\n 'atoll_add_comment',\n 'atoll_list_projects',\n 'atoll_get_project',\n 'atoll_create_project',\n 'atoll_list_goals',\n 'atoll_get_goal',\n 'atoll_create_goal',\n 'atoll_update_goal',\n 'atoll_list_kpis',\n 'atoll_get_kpi',\n 'atoll_create_kpi',\n 'atoll_update_kpi',\n 'atoll_list_kpi_snapshots',\n 'atoll_record_kpi_snapshot',\n 'atoll_create_kpi_http_sync_draft',\n 'atoll_validate_kpi_http_sync_config',\n 'atoll_list_initiatives',\n 'atoll_get_initiative',\n 'atoll_create_initiative',\n 'atoll_update_initiative',\n 'atoll_link_initiative_issue',\n 'atoll_link_initiative_milestone',\n 'atoll_link_initiative_kpi',\n 'atoll_list_initiative_targets',\n 'atoll_get_initiative_target',\n 'atoll_create_initiative_target',\n 'atoll_update_initiative_target',\n 'atoll_delete_initiative_target',\n 'atoll_link_initiative_target_issue',\n 'atoll_unlink_initiative_target_issue',\n 'atoll_link_initiative_target_milestone',\n 'atoll_unlink_initiative_target_milestone',\n 'atoll_list_milestones',\n 'atoll_create_milestone',\n 'atoll_upsert_milestone',\n 'atoll_list_dependencies',\n 'atoll_add_dependency',\n 'atoll_remove_dependency',\n 'atoll_list_webhooks',\n 'atoll_create_webhook',\n 'atoll_delete_webhook',\n 'atoll_send_feedback',\n 'atoll_api_request',\n] as const;\n\ntype ToolName = typeof ATOLL_TOOL_NAMES[number];\ntype ToolArgs = Record<string, unknown>;\ntype ToolExtra = { authInfo?: { token?: string } };\ntype ToolHandler = (args: ToolArgs, extra: ToolExtra) => Promise<unknown>;\n\nconst orgId = z.string().min(1).optional().describe('Atoll org UUID. Optional when ATOLL_ORG_ID is configured or the API key has one accessible org.');\nconst issueId = z.string().min(1).describe('Issue UUID or API-accepted issue identifier.');\nconst projectId = z.string().min(1).describe('Project UUID.');\nconst goalId = z.string().min(1).describe('Goal UUID.');\nconst kpiId = z.string().min(1).describe('KPI UUID.');\nconst initiativeId = z.string().min(1).describe('Initiative UUID.');\nconst initiativeTargetId = z.string().min(1).describe('Initiative target UUID.');\nconst milestoneId = z.string().min(1).describe('Milestone UUID.');\nconst limit = z.number().int().min(1).max(100).default(25).describe('Maximum records to return, 1-100.');\nconst offset = z.number().int().min(0).default(0).describe('Pagination offset.');\nconst priority = z.number().int().min(0).max(3).optional().describe('Priority: 0 urgent, 1 high, 2 medium, 3 low.');\nconst kpiHttpSyncName = z.string().min(1).describe('Human-readable draft name.');\nconst kpiHttpSyncSchedule = z.enum(['hourly', 'daily']).describe('Polling schedule.');\nconst kpiHttpSyncRequestConfig = z.record(z.string(), z.unknown()).describe('Safe request_config: GET, HTTPS JSON URL, no request body, no inline query strings, and only secretRef placeholders for Authorization Bearer or X-API-Key.');\nconst kpiHttpSyncExtractionConfig = z.record(z.string(), z.unknown()).describe('JSON Pointer extraction config, e.g. { contentType: \"json\", pointer: \"/results/0/value\", numeric: { mode: \"number\" } }.');\nconst kpiHttpSyncFreshnessConfig = z.record(z.string(), z.unknown()).optional().describe('Optional freshness_config. Use {} for v1 unless a documented field is needed.');\n\nexport function listAtollToolNames(): string[] {\n return [...ATOLL_TOOL_NAMES];\n}\n\nexport interface AtollMcpServer {\n server: McpServer;\n instructions: string;\n toolNames: string[];\n}\n\nexport function createAtollMcpServer(): AtollMcpServer {\n const server = new McpServer(\n {\n name: 'atoll-mcp-server',\n version: VERSION,\n websiteUrl: 'https://atollhq.com',\n },\n {\n instructions: ATOLL_MCP_INSTRUCTIONS,\n capabilities: {\n resources: {},\n tools: {},\n },\n },\n );\n\n registerAtollTools(server);\n registerAtollResources(server);\n return { server, instructions: ATOLL_MCP_INSTRUCTIONS, toolNames: listAtollToolNames() };\n}\n\nfunction registerAtollResources(server: McpServer): void {\n server.registerResource(\n 'atoll_skill_packaging_guidance',\n 'atoll://skills/packaging',\n {\n title: 'Atoll Skill Packaging Guidance',\n description: 'Explains why Atoll skills remain separate packages from the MCP server.',\n mimeType: 'text/markdown',\n },\n async (uri) => ({\n contents: [\n {\n uri: uri.href,\n mimeType: 'text/markdown',\n text: `# Atoll skills and MCP packaging\n\nKeep Atoll agent skills as separate installable packages. The MCP server is a remote tool surface and should stay runtime-focused: auth, transport, validation, API calls, and structured responses.\n\nSkills remain better as client-side guidance because different agent environments install and invoke skills differently. The MCP server can expose this resource and Atoll docs links so clients know which skill package to install, without coupling server deployment to local skill files.`,\n },\n ],\n }),\n );\n}\n\nfunction registerAtollTools(server: McpServer): void {\n registerTool(server, 'atoll_get_auth_context', {\n title: 'Get Atoll Auth Context',\n description: 'Validate the active Atoll API key and return its auth context. Mirrors `atoll auth status --json` for remote clients.',\n inputSchema: {},\n readOnly: true,\n handler: async (_args, extra) => clientFromExtra(extra).get('/api/auth/me'),\n });\n\n registerTool(server, 'atoll_list_orgs', {\n title: 'List Atoll Orgs',\n description: 'List organizations accessible to the Atoll API key. Use this when org_id is unknown.',\n inputSchema: {},\n readOnly: true,\n handler: async (_args, extra) => clientFromExtra(extra).get('/api/orgs'),\n });\n\n registerTool(server, 'atoll_get_heartbeat', {\n title: 'Get Atoll Heartbeat',\n description: 'Get the agent heartbeat briefing: goal/KPI pace, assigned work, stalled initiatives, and prioritized signals. Mirrors `atoll heartbeat --json`.',\n inputSchema: {\n org_id: orgId,\n severity: z.enum(['critical', 'warning', 'info']).optional().describe('Optional signal severity filter.'),\n signals_only: z.boolean().default(false).describe('Return only filtered heartbeat signals.'),\n },\n readOnly: true,\n handler: async (args, extra) => {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n const data = await client.get<Record<string, unknown>>(`/api/orgs/${encodeURIComponent(resolvedOrgId)}/heartbeat`);\n const severity = stringArg(args.severity);\n const signals = Array.isArray(data.signals)\n ? data.signals.filter((signal) => !severity || (signal as { severity?: string }).severity === severity)\n : [];\n return buildHeartbeatToolPayload(data, signals, Boolean(args.signals_only));\n },\n });\n\n registerIssueTools(server);\n registerProjectTools(server);\n registerGoalTools(server);\n registerKpiTools(server);\n registerInitiativeTools(server);\n registerMilestoneTools(server);\n registerDependencyTools(server);\n registerWebhookTools(server);\n registerFeedbackTools(server);\n registerGenericApiTool(server);\n}\n\nfunction registerIssueTools(server: McpServer): void {\n registerTool(server, 'atoll_list_issues', {\n title: 'List Atoll Issues',\n description: 'List Atoll tasks/issues with CLI-compatible pagination. Mirrors `atoll issue list --json`.',\n inputSchema: {\n org_id: orgId,\n status: z.string().optional(),\n priority,\n project_id: z.string().optional(),\n assignee_id: z.string().optional(),\n team_id: z.string().optional(),\n milestone_id: z.string().optional(),\n q: z.string().optional().describe('Search query for title/description.'),\n include_archived: z.boolean().optional(),\n order_by: z.enum(['created_at', 'updated_at', 'priority', 'due_date', 'title', 'status']).optional(),\n order_dir: z.enum(['asc', 'desc']).optional(),\n limit,\n offset,\n },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, '/issues', issueListParams(args)),\n });\n\n registerTool(server, 'atoll_get_issue', {\n title: 'Get Atoll Issue',\n description: 'Get one Atoll task/issue with enriched detail. Mirrors `atoll issue get --json`.',\n inputSchema: { org_id: orgId, issue_id: issueId },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}`),\n });\n\n registerTool(server, 'atoll_create_issue', {\n title: 'Create Atoll Issue',\n description: 'Create an Atoll task/issue. Mirrors `atoll issue create --json`.',\n inputSchema: {\n org_id: orgId,\n title: z.string().min(1),\n description: z.string().optional(),\n status: z.string().optional(),\n priority,\n project_id: z.string().optional(),\n milestone_id: z.string().optional(),\n team_id: z.string().optional(),\n assignee_id: z.string().optional(),\n assignee_ids: z.array(z.string()).optional(),\n start_date: z.string().optional(),\n due_date: z.string().optional(),\n label_ids: z.array(z.string()).optional(),\n },\n readOnly: false,\n handler: async (args, extra) => orgPost(extra, args, '/issues', buildIssueBody(args)),\n });\n\n registerTool(server, 'atoll_update_issue', {\n title: 'Update Atoll Issue',\n description: 'Update title, description, status, priority, project, milestone, team, assignees, dates, labels, or comment_body on an Atoll task.',\n inputSchema: {\n org_id: orgId,\n issue_id: issueId,\n title: z.string().optional(),\n description: z.string().nullable().optional(),\n comment_body: z.string().optional().describe('Optional Markdown comment body to create with this update. Use this to preserve strategy evidence when changing status.'),\n commentBody: z.string().optional().describe('CamelCase alias for comment_body.'),\n status: z.string().optional(),\n priority,\n project_id: z.string().nullable().optional(),\n milestone_id: z.string().nullable().optional(),\n team_id: z.string().nullable().optional(),\n assignee_id: z.string().nullable().optional(),\n assignee_ids: z.array(z.string()).optional(),\n start_date: z.string().nullable().optional(),\n due_date: z.string().nullable().optional(),\n label_ids: z.array(z.string()).optional(),\n },\n readOnly: false,\n handler: async (args, extra) =>\n orgPatch(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}`, nonEmptyBody(buildIssueBody(args))),\n });\n\n registerTool(server, 'atoll_archive_issue', {\n title: 'Archive Atoll Issue',\n description: 'Soft-delete/archive an issue without requiring owner/admin permanent delete permissions. Mirrors `atoll issue archive`.',\n inputSchema: { org_id: orgId, issue_id: issueId },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/archive`, undefined),\n });\n\n registerTool(server, 'atoll_unarchive_issue', {\n title: 'Unarchive Atoll Issue',\n description: 'Restore an archived issue. Mirrors `atoll issue unarchive`.',\n inputSchema: { org_id: orgId, issue_id: issueId },\n readOnly: false,\n handler: async (args, extra) =>\n orgDelete(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/archive`),\n });\n\n registerTool(server, 'atoll_list_comments', {\n title: 'List Atoll Issue Comments',\n description: 'List comments for an Atoll issue.',\n inputSchema: { org_id: orgId, issue_id: issueId },\n readOnly: true,\n handler: async (args, extra) =>\n orgGet(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/comments`),\n });\n\n registerTool(server, 'atoll_add_comment', {\n title: 'Add Atoll Issue Comment',\n description: 'Add a Markdown comment to an Atoll issue. Mirrors `atoll comment add`.',\n inputSchema: {\n org_id: orgId,\n issue_id: issueId,\n body: z.string().min(1).describe('Markdown comment body.'),\n },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/comments`, {\n body: requiredString(args.body, 'body'),\n }),\n });\n}\n\nfunction registerProjectTools(server: McpServer): void {\n registerTool(server, 'atoll_list_projects', {\n title: 'List Atoll Projects',\n description: 'List projects visible to the API key. Mirrors `atoll project list --json`.',\n inputSchema: { org_id: orgId, limit },\n readOnly: true,\n handler: async (args, extra) => buildProjectListPayload(await orgGet(extra, args, '/projects'), numberArg(args.limit, 25)),\n });\n\n registerTool(server, 'atoll_get_project', {\n title: 'Get Atoll Project',\n description: 'Get project detail and issues. Mirrors `atoll project get --json`.',\n inputSchema: { org_id: orgId, project_id: projectId },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, `/projects/${encodeURIComponent(requiredString(args.project_id, 'project_id'))}`),\n });\n\n registerTool(server, 'atoll_create_project', {\n title: 'Create Atoll Project',\n description: 'Create a project. Mirrors `atoll project create --json`.',\n inputSchema: {\n org_id: orgId,\n name: z.string().min(1),\n description: z.string().optional(),\n visibility: z.string().optional(),\n color: z.string().optional(),\n icon: z.string().optional(),\n github_repo: z.string().optional(),\n },\n readOnly: false,\n handler: async (args, extra) => orgPost(extra, args, '/projects', pickDefined(args, ['name', 'description', 'visibility', 'color', 'icon', 'github_repo'])),\n });\n}\n\nfunction registerGoalTools(server: McpServer): void {\n registerCrudTools(server, 'goal', '/goals', goalId, ['title', 'description', 'owner_id', 'status', 'target_date'], {\n listFilters: { status: z.string().optional(), limit },\n createRequired: { title: z.string().min(1) },\n });\n}\n\nfunction registerKpiTools(server: McpServer): void {\n registerCrudTools(server, 'kpi', '/kpis', kpiId, [\n 'name',\n 'goal_id',\n 'unit',\n 'unit_label',\n 'target_value',\n 'target_direction',\n 'current_value',\n 'stale_after_hours',\n ], {\n listFilters: { goal_id: z.string().optional(), limit },\n createRequired: { name: z.string().min(1) },\n });\n\n registerTool(server, 'atoll_list_kpi_snapshots', {\n title: 'List Atoll KPI Snapshots',\n description: 'List snapshots for a KPI. Mirrors `atoll kpi snapshot list --json`.',\n inputSchema: { org_id: orgId, kpi_id: kpiId, limit },\n readOnly: true,\n handler: async (args, extra) =>\n orgGet(extra, args, `/kpis/${encodeURIComponent(requiredString(args.kpi_id, 'kpi_id'))}/snapshots`, {\n limit: args.limit,\n }),\n });\n\n registerTool(server, 'atoll_record_kpi_snapshot', {\n title: 'Record Atoll KPI Snapshot',\n description: 'Record a KPI measurement. Mirrors `atoll kpi snapshot add --json`.',\n inputSchema: {\n org_id: orgId,\n kpi_id: kpiId,\n value: z.number(),\n recorded_at: z.string().optional(),\n attribution_note: z.string().optional(),\n attributed_to_initiative_id: z.string().optional(),\n attributed_to_issue_id: z.string().optional(),\n },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/kpis/${encodeURIComponent(requiredString(args.kpi_id, 'kpi_id'))}/snapshots`, {\n source: 'manual',\n ...pickDefined(args, ['value', 'recorded_at', 'attribution_note', 'attributed_to_initiative_id', 'attributed_to_issue_id']),\n }),\n });\n\n registerTool(server, 'atoll_create_kpi_http_sync_draft', {\n title: 'Create Atoll KPI HTTP Sync Draft',\n description: 'Create a draft-only generic HTTPS JSON KPI sync for human admin review. Do not include secret values. Human admins must add secrets, dry-run, and publish in Atoll.',\n inputSchema: {\n org_id: orgId,\n kpi_id: kpiId,\n name: kpiHttpSyncName,\n schedule: kpiHttpSyncSchedule,\n request_config: kpiHttpSyncRequestConfig,\n extraction_config: kpiHttpSyncExtractionConfig,\n freshness_config: kpiHttpSyncFreshnessConfig,\n },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/kpis/${encodeURIComponent(requiredString(args.kpi_id, 'kpi_id'))}/http-syncs`, safeKpiHttpSyncAgentBody({\n name: args.name,\n schedule: args.schedule,\n request_config: args.request_config,\n extraction_config: args.extraction_config,\n freshness_config: args.freshness_config ?? {},\n })),\n });\n\n registerTool(server, 'atoll_validate_kpi_http_sync_config', {\n title: 'Validate Atoll KPI HTTP Sync Config',\n description: 'Validate a proposed KPI HTTP sync config without storing it, running network requests, adding secrets, publishing, or writing snapshots.',\n inputSchema: {\n org_id: orgId,\n kpi_id: kpiId,\n name: kpiHttpSyncName,\n schedule: kpiHttpSyncSchedule,\n request_config: kpiHttpSyncRequestConfig,\n extraction_config: kpiHttpSyncExtractionConfig,\n freshness_config: kpiHttpSyncFreshnessConfig,\n },\n readOnly: true,\n handler: async (args, extra) =>\n orgPut(extra, args, `/kpis/${encodeURIComponent(requiredString(args.kpi_id, 'kpi_id'))}/http-syncs`, safeKpiHttpSyncAgentBody({\n name: args.name,\n schedule: args.schedule,\n request_config: args.request_config,\n extraction_config: args.extraction_config,\n freshness_config: args.freshness_config ?? {},\n })),\n });\n}\n\nfunction registerInitiativeTools(server: McpServer): void {\n registerCrudTools(server, 'initiative', '/initiatives', initiativeId, ['title', 'name', 'description', 'goal_id', 'owner_id', 'status', 'target_date'], {\n listFilters: { goal_id: z.string().optional(), status: z.string().optional(), owner_id: z.string().optional(), limit },\n createRequired: { title: z.string().min(1) },\n });\n\n registerLinkTool(server, 'atoll_link_initiative_issue', 'issue', 'issues', 'issue_id', issueId);\n registerLinkTool(server, 'atoll_link_initiative_milestone', 'milestone', 'milestones', 'milestone_id', milestoneId);\n registerLinkTool(server, 'atoll_link_initiative_kpi', 'KPI impact', 'kpi-impacts', 'kpi_id', kpiId, {\n expected_impact: z.string().optional(),\n });\n registerInitiativeTargetTools(server);\n}\n\nfunction registerInitiativeTargetTools(server: McpServer): void {\n const targetBodySchema = {\n title: z.string().min(1).optional(),\n description: z.string().nullable().optional(),\n mode: z.enum(['progress', 'gate']).optional(),\n unit: z.enum(['count', 'percentage', 'currency', 'duration', 'ratio', 'custom']).optional(),\n unit_label: z.string().nullable().optional(),\n current_value: z.number().nullable().optional(),\n target_value: z.number().nullable().optional(),\n target_direction: z.enum(['increase', 'decrease', 'maintain']).optional(),\n target_date: z.string().nullable().optional(),\n due_soon_days: z.number().int().min(0).nullable().optional(),\n };\n\n registerTool(server, 'atoll_list_initiative_targets', {\n title: 'List Atoll Initiative Targets',\n description: 'List progress and gate targets under an initiative. Gate targets represent launch prerequisites and should not be interpreted as KPI pace.',\n inputSchema: { org_id: orgId, initiative_id: initiativeId },\n readOnly: true,\n handler: async (args, extra) =>\n orgGet(extra, args, `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/targets`),\n });\n\n registerTool(server, 'atoll_get_initiative_target', {\n title: 'Get Atoll Initiative Target',\n description: 'Get one progress or gate target under an initiative.',\n inputSchema: { org_id: orgId, initiative_id: initiativeId, target_id: initiativeTargetId },\n readOnly: true,\n handler: async (args, extra) =>\n orgGet(extra, args, `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/targets/${encodeURIComponent(requiredString(args.target_id, 'target_id'))}`),\n });\n\n registerTool(server, 'atoll_create_initiative_target', {\n title: 'Create Atoll Initiative Target',\n description: 'Create an initiative target. Use mode=progress for output tracking and mode=gate for hard launch prerequisites.',\n inputSchema: { org_id: orgId, initiative_id: initiativeId, ...targetBodySchema, title: z.string().min(1) },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/targets`, nonEmptyBody(pickDefined(args, Object.keys(targetBodySchema)))),\n });\n\n registerTool(server, 'atoll_update_initiative_target', {\n title: 'Update Atoll Initiative Target',\n description: 'Update an initiative target current value, target value, mode, date, or descriptive fields.',\n inputSchema: { org_id: orgId, initiative_id: initiativeId, target_id: initiativeTargetId, ...targetBodySchema },\n readOnly: false,\n handler: async (args, extra) =>\n orgPatch(\n extra,\n args,\n `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/targets/${encodeURIComponent(requiredString(args.target_id, 'target_id'))}`,\n nonEmptyBody(pickDefined(args, Object.keys(targetBodySchema))),\n ),\n });\n\n registerTool(server, 'atoll_delete_initiative_target', {\n title: 'Delete Atoll Initiative Target',\n description: 'Delete an initiative target and its target-specific work links.',\n inputSchema: { org_id: orgId, initiative_id: initiativeId, target_id: initiativeTargetId },\n readOnly: false,\n destructive: true,\n handler: async (args, extra) =>\n orgDelete(extra, args, `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/targets/${encodeURIComponent(requiredString(args.target_id, 'target_id'))}`),\n });\n\n registerInitiativeTargetLinkTool(server, 'atoll_link_initiative_target_issue', 'issue', 'issues', 'issue_id', issueId, false);\n registerInitiativeTargetLinkTool(server, 'atoll_unlink_initiative_target_issue', 'issue', 'issues', 'issue_id', issueId, true);\n registerInitiativeTargetLinkTool(server, 'atoll_link_initiative_target_milestone', 'milestone', 'milestones', 'milestone_id', milestoneId, false);\n registerInitiativeTargetLinkTool(server, 'atoll_unlink_initiative_target_milestone', 'milestone', 'milestones', 'milestone_id', milestoneId, true);\n}\n\nfunction registerMilestoneTools(server: McpServer): void {\n registerTool(server, 'atoll_list_milestones', {\n title: 'List Atoll Milestones',\n description: 'List milestones for a project. Mirrors `atoll milestone list --json`.',\n inputSchema: { org_id: orgId, project_id: projectId },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, `/projects/${encodeURIComponent(requiredString(args.project_id, 'project_id'))}/milestones`),\n });\n\n registerTool(server, 'atoll_create_milestone', {\n title: 'Create Atoll Milestone',\n description: 'Create a milestone in a project. Mirrors `atoll milestone create --json`.',\n inputSchema: {\n org_id: orgId,\n project_id: projectId,\n name: z.string().min(1),\n description: z.string().optional(),\n status: z.string().optional(),\n target_date: z.string().optional(),\n due_date: z.string().optional(),\n },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/projects/${encodeURIComponent(requiredString(args.project_id, 'project_id'))}/milestones`, pickDefined(args, ['name', 'description', 'status', 'target_date', 'due_date'])),\n });\n\n registerTool(server, 'atoll_upsert_milestone', {\n title: 'Upsert Atoll Milestone',\n description: 'Retry-safe milestone sync by name within a project. If the API lacks direct upsert support, this tool performs list-then-create/update.',\n inputSchema: {\n org_id: orgId,\n project_id: projectId,\n name: z.string().min(1),\n description: z.string().optional(),\n status: z.string().optional(),\n target_date: z.string().optional(),\n due_date: z.string().optional(),\n },\n readOnly: false,\n handler: async (args, extra) => {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n const path = `/api/orgs/${encodeURIComponent(resolvedOrgId)}/projects/${encodeURIComponent(requiredString(args.project_id, 'project_id'))}/milestones`;\n const data = await client.get<{ milestones?: Array<{ id: string; name?: string | null }> }>(path);\n const existing = (data.milestones ?? []).find((milestone) => milestone.name === args.name);\n const body = pickDefined(args, ['name', 'description', 'status', 'target_date', 'due_date']);\n if (!existing) {\n return { action: 'created', ...(await client.post(path, body) as Record<string, unknown>) };\n }\n return {\n action: 'updated',\n ...(await client.patch(`/api/orgs/${encodeURIComponent(resolvedOrgId)}/milestones/${encodeURIComponent(existing.id)}`, body) as Record<string, unknown>),\n };\n },\n });\n}\n\nfunction registerDependencyTools(server: McpServer): void {\n registerTool(server, 'atoll_list_dependencies', {\n title: 'List Atoll Issue Dependencies',\n description: 'List tasks this issue blocks and tasks blocking it. Mirrors `atoll dependency list --json`.',\n inputSchema: { org_id: orgId, issue_id: issueId },\n readOnly: true,\n handler: async (args, extra) =>\n orgGet(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/dependencies`),\n });\n\n registerTool(server, 'atoll_add_dependency', {\n title: 'Add Atoll Issue Dependency',\n description: 'Add a blocking relationship. Provide exactly one of blocked_by_issue_id or blocking_issue_id.',\n inputSchema: {\n org_id: orgId,\n issue_id: issueId,\n blocked_by_issue_id: z.string().optional(),\n blocking_issue_id: z.string().optional(),\n },\n readOnly: false,\n handler: async (args, extra) => {\n const hasBlockedBy = typeof args.blocked_by_issue_id === 'string';\n const hasBlocking = typeof args.blocking_issue_id === 'string';\n if (hasBlockedBy === hasBlocking) throw new Error('Provide exactly one of blocked_by_issue_id or blocking_issue_id.');\n return orgPost(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/dependencies`, {\n ...(hasBlockedBy ? { blockedByIssueId: args.blocked_by_issue_id } : {}),\n ...(hasBlocking ? { blockingIssueId: args.blocking_issue_id } : {}),\n });\n },\n });\n\n registerTool(server, 'atoll_remove_dependency', {\n title: 'Remove Atoll Issue Dependency',\n description: 'Remove a dependency edge from an issue.',\n inputSchema: { org_id: orgId, issue_id: issueId, dependency_id: z.string().min(1) },\n readOnly: false,\n handler: async (args, extra) =>\n orgDelete(extra, args, `/issues/${encodeURIComponent(requiredString(args.issue_id, 'issue_id'))}/dependencies/${encodeURIComponent(requiredString(args.dependency_id, 'dependency_id'))}`),\n });\n}\n\nfunction registerWebhookTools(server: McpServer): void {\n registerTool(server, 'atoll_list_webhooks', {\n title: 'List Atoll Webhooks',\n description: 'List org webhooks. Mirrors `atoll webhook list --json`.',\n inputSchema: { org_id: orgId },\n readOnly: true,\n handler: async (args, extra) => {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.get(`/api/webhooks?${new URLSearchParams({ orgId: resolvedOrgId }).toString()}`);\n },\n });\n\n registerTool(server, 'atoll_create_webhook', {\n title: 'Create Atoll Webhook',\n description: 'Create an outbound webhook. The returned secret is shown once by the API.',\n inputSchema: {\n org_id: orgId,\n url: z.string().url(),\n events: z.array(z.string()).min(1),\n enabled: z.boolean().optional(),\n },\n readOnly: false,\n handler: async (args, extra) => {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.post(`/api/webhooks?${new URLSearchParams({ orgId: resolvedOrgId }).toString()}`, pickDefined(args, ['url', 'events', 'enabled']));\n },\n });\n\n registerTool(server, 'atoll_delete_webhook', {\n title: 'Delete Atoll Webhook',\n description: 'Delete an outbound webhook.',\n inputSchema: { webhook_id: z.string().min(1) },\n readOnly: false,\n destructive: true,\n handler: async (args, extra) => clientFromExtra(extra).delete(`/api/webhooks/${encodeURIComponent(requiredString(args.webhook_id, 'webhook_id'))}`),\n });\n}\n\nfunction registerFeedbackTools(server: McpServer): void {\n registerTool(server, 'atoll_send_feedback', {\n title: 'Send Atoll Platform Feedback',\n description: 'Send bug reports or feature requests to the Atoll platform team, not to the current org.',\n inputSchema: {\n type: z.enum(['bug', 'feature']).default('bug'),\n description: z.string().min(1),\n userEmail: z.string().email().optional(),\n userName: z.string().optional(),\n url: z.string().url().optional(),\n },\n readOnly: false,\n handler: async (args) => {\n const response = await fetch(`${process.env.ATOLL_BASE_URL ?? 'https://atollhq.com'}/api/feedback`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'User-Agent': 'atoll-mcp-server' },\n body: JSON.stringify(pickDefined(args, ['type', 'description', 'userEmail', 'userName', 'url'])),\n });\n const text = await response.text();\n const data = text ? JSON.parse(text) : undefined;\n if (!response.ok) throw new Error(`Atoll feedback API ${response.status}: ${text}`);\n return data;\n },\n });\n}\n\nfunction registerGenericApiTool(server: McpServer): void {\n registerTool(server, 'atoll_api_request', {\n title: 'Call Atoll API',\n description: 'Advanced fallback for API operations not yet represented as first-class MCP tools. Path must be relative and under /api/.',\n inputSchema: {\n method: z.enum(SUPPORTED_API_METHODS),\n path: z.string().min(1).describe('Relative Atoll API path, e.g. /api/orgs/{orgId}/issues?limit=10. Full URLs are rejected.'),\n body: z.unknown().optional(),\n },\n readOnly: false,\n handler: async (args, extra) => {\n const path = requiredString(args.path, 'path');\n if (isKpiHttpSyncApiPath(path)) {\n throw new Error('KPI HTTP sync routes are not available through atoll_api_request. Use atoll_create_kpi_http_sync_draft or atoll_validate_kpi_http_sync_config; human admins must use Atoll UI for secrets, dry-run, publish, and execution.');\n }\n return clientFromExtra(extra).request(requiredString(args.method, 'method'), path, args.body);\n },\n });\n}\n\nexport function isKpiHttpSyncApiPath(path: string): boolean {\n if (!path.startsWith('/')) return false;\n let pathname: string;\n try {\n pathname = new URL(path, 'https://atoll.local').pathname;\n } catch {\n return false;\n }\n return /^\\/api\\/orgs\\/[^/]+\\/kpis\\/[^/]+\\/http-syncs(?:\\/|$)/.test(pathname);\n}\n\nexport function safeKpiHttpSyncAgentBody(body: Record<string, unknown>): Record<string, unknown> {\n const request = body.request_config;\n if (isObjectRecord(request) && typeof request.url === 'string' && new URLSearchParams(request.url.split('?', 2)[1] ?? '').toString()) {\n throw new Error('KPI HTTP sync URLs must not include inline query strings. Query params are disabled in v1.');\n }\n\n if (isObjectRecord(request) && isObjectRecord(request.headers)) {\n for (const [name, value] of Object.entries(request.headers)) {\n const normalizedName = name.trim().toLowerCase();\n if (normalizedName === 'authorization' || normalizedName === 'x-api-key') {\n if (!isObjectRecord(value) || typeof value.secretRef !== 'string') {\n throw new Error(`${name} must use a non-secret secretRef placeholder, not a header value.`);\n }\n assertSafeKpiHttpSyncSecretRef(value.secretRef, `${name}.secretRef`);\n } else if (isObjectRecord(value) && 'secretRef' in value) {\n throw new Error('Secret refs are only supported for Authorization and X-API-Key headers.');\n }\n }\n }\n\n const unsafe = findUnsafeKpiHttpSyncString(body, []);\n if (unsafe) {\n throw new Error(`Refusing possible secret value at ${unsafe.path}. Use a short placeholder secretRef and enter the secret in Atoll UI.`);\n }\n return body;\n}\n\nexport function buildProjectListPayload(data: unknown, requestedLimit: number): Record<string, unknown> {\n const projects = Array.isArray((data as { projects?: unknown[] }).projects) ? (data as { projects: unknown[] }).projects : [];\n const limitValue = Math.max(1, Math.min(100, requestedLimit));\n const items = projects.slice(0, limitValue);\n const truncated = projects.length > items.length;\n return {\n resource: 'projects',\n items,\n total: projects.length,\n limit: limitValue,\n offset: 0,\n nextOffset: truncated ? items.length : null,\n truncated,\n hint: truncated ? 'Increase limit up to 100 to return more projects.' : null,\n };\n}\n\nexport function buildHeartbeatToolPayload(\n data: Record<string, unknown>,\n signals: unknown[],\n signalsOnly: boolean,\n): Record<string, unknown> {\n if (signalsOnly) {\n return {\n signals,\n recommended_action: data.recommended_action ?? null,\n };\n }\n return { ...data, signals };\n}\n\nfunction registerCrudTools(\n server: McpServer,\n resource: 'goal' | 'kpi' | 'initiative',\n basePath: string,\n idSchema: z.ZodString,\n bodyFields: string[],\n options: {\n listFilters: Record<string, z.ZodTypeAny>;\n createRequired: Record<string, z.ZodTypeAny>;\n },\n): void {\n const idField = `${resource}_id`;\n const resourcePlural = resource === 'kpi' ? 'kpis' : `${resource}s`;\n const bodySchema = Object.fromEntries(bodyFields.map((field) => [field, z.unknown().optional()]));\n\n registerTool(server, `atoll_list_${resourcePlural}` as ToolName, {\n title: `List Atoll ${resourcePlural}`,\n description: `List Atoll ${resourcePlural}. Mirrors \\`atoll ${resource} list --json\\`.`,\n inputSchema: { org_id: orgId, ...options.listFilters },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, basePath, pickDefined(args, Object.keys(options.listFilters))),\n });\n\n registerTool(server, `atoll_get_${resource}` as ToolName, {\n title: `Get Atoll ${resource}`,\n description: `Get one Atoll ${resource}. Mirrors \\`atoll ${resource} get --json\\`.`,\n inputSchema: { org_id: orgId, [idField]: idSchema },\n readOnly: true,\n handler: async (args, extra) => orgGet(extra, args, `${basePath}/${encodeURIComponent(requiredString(args[idField], idField))}`),\n });\n\n registerTool(server, `atoll_create_${resource}` as ToolName, {\n title: `Create Atoll ${resource}`,\n description: `Create an Atoll ${resource}. Mirrors \\`atoll ${resource} create --json\\`.`,\n inputSchema: { org_id: orgId, ...bodySchema, ...options.createRequired },\n readOnly: false,\n handler: async (args, extra) => orgPost(extra, args, basePath, nonEmptyBody(pickDefined(args, bodyFields))),\n });\n\n registerTool(server, `atoll_update_${resource}` as ToolName, {\n title: `Update Atoll ${resource}`,\n description: `Update an Atoll ${resource}. Mirrors \\`atoll ${resource} update --json\\`.`,\n inputSchema: { org_id: orgId, [idField]: idSchema, ...bodySchema },\n readOnly: false,\n handler: async (args, extra) =>\n orgPatch(extra, args, `${basePath}/${encodeURIComponent(requiredString(args[idField], idField))}`, nonEmptyBody(pickDefined(args, bodyFields))),\n });\n}\n\nfunction registerLinkTool(\n server: McpServer,\n name: ToolName,\n label: string,\n linkPath: string,\n idField: string,\n idFieldSchema: z.ZodString,\n extraSchema: Record<string, z.ZodTypeAny> = {},\n): void {\n registerTool(server, name, {\n title: `Link Atoll Initiative ${label}`,\n description: `Link an initiative to a ${label}.`,\n inputSchema: { org_id: orgId, initiative_id: initiativeId, [idField]: idFieldSchema, ...extraSchema },\n readOnly: false,\n handler: async (args, extra) =>\n orgPost(extra, args, `/initiatives/${encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'))}/${linkPath}`, {\n [idField]: args[idField],\n ...pickDefined(args, Object.keys(extraSchema)),\n }),\n });\n}\n\nfunction registerInitiativeTargetLinkTool(\n server: McpServer,\n name: ToolName,\n label: string,\n linkPath: string,\n idField: string,\n idFieldSchema: z.ZodString,\n unlink: boolean,\n): void {\n registerTool(server, name, {\n title: `${unlink ? 'Unlink' : 'Link'} Atoll Initiative Target ${label}`,\n description: `${unlink ? 'Unlink' : 'Link'} an initiative target to a ${label}.`,\n inputSchema: {\n org_id: orgId,\n initiative_id: initiativeId,\n target_id: initiativeTargetId,\n [idField]: idFieldSchema,\n },\n readOnly: false,\n handler: async (args, extra) => {\n const initiative = encodeURIComponent(requiredString(args.initiative_id, 'initiative_id'));\n const target = encodeURIComponent(requiredString(args.target_id, 'target_id'));\n const linkedId = encodeURIComponent(requiredString(args[idField], idField));\n const path = `/initiatives/${initiative}/targets/${target}/${linkPath}`;\n if (unlink) return orgDelete(extra, args, `${path}/${linkedId}`);\n return orgPost(extra, args, path, { [idField]: args[idField] });\n },\n });\n}\n\nfunction registerTool(\n server: McpServer,\n name: ToolName,\n config: {\n title: string;\n description: string;\n inputSchema: Record<string, z.ZodTypeAny>;\n readOnly: boolean;\n destructive?: boolean;\n handler: ToolHandler;\n },\n): void {\n server.registerTool(\n name,\n {\n title: config.title,\n description: config.description,\n inputSchema: config.inputSchema,\n annotations: {\n readOnlyHint: config.readOnly,\n destructiveHint: config.destructive ?? false,\n idempotentHint: config.readOnly,\n openWorldHint: true,\n },\n },\n async (args, extra): Promise<CallToolResult> => {\n try {\n const data = await config.handler(args as ToolArgs, extra as ToolExtra);\n return toolResult(data);\n } catch (error) {\n return toolError(error);\n }\n },\n );\n}\n\nfunction clientFromExtra(extra: ToolExtra): AtollApiClient {\n const token = extra.authInfo?.token;\n return new AtollApiClient({ apiKey: resolveAuthToken(token ? `Bearer ${token}` : undefined) });\n}\n\nasync function orgGet(extra: ToolExtra, args: ToolArgs, path: string, params?: Record<string, unknown>): Promise<unknown> {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.get(`/api/orgs/${encodeURIComponent(resolvedOrgId)}${path}${queryString(params)}`);\n}\n\nasync function orgPost(extra: ToolExtra, args: ToolArgs, path: string, body?: unknown): Promise<unknown> {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.post(`/api/orgs/${encodeURIComponent(resolvedOrgId)}${path}`, body);\n}\n\nasync function orgPut(extra: ToolExtra, args: ToolArgs, path: string, body?: unknown): Promise<unknown> {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.put(`/api/orgs/${encodeURIComponent(resolvedOrgId)}${path}`, body);\n}\n\nasync function orgPatch(extra: ToolExtra, args: ToolArgs, path: string, body: unknown): Promise<unknown> {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.patch(`/api/orgs/${encodeURIComponent(resolvedOrgId)}${path}`, body);\n}\n\nasync function orgDelete(extra: ToolExtra, args: ToolArgs, path: string): Promise<unknown> {\n const client = clientFromExtra(extra);\n const resolvedOrgId = await resolveOrgId(client, stringArg(args.org_id));\n return client.delete(`/api/orgs/${encodeURIComponent(resolvedOrgId)}${path}`);\n}\n\nfunction issueListParams(args: ToolArgs): Record<string, unknown> {\n return {\n status: args.status,\n priority: args.priority,\n projectId: args.project_id,\n assigneeId: args.assignee_id,\n teamId: args.team_id,\n milestoneId: args.milestone_id,\n q: args.q,\n includeArchived: args.include_archived,\n orderBy: args.order_by,\n orderDir: args.order_dir,\n limit: args.limit,\n offset: args.offset,\n shape: 'envelope',\n };\n}\n\nexport function buildIssueBody(args: ToolArgs): Record<string, unknown> {\n return pickDefined(args, [\n 'title',\n 'description',\n 'commentBody',\n 'comment_body',\n 'status',\n 'priority',\n 'project_id',\n 'milestone_id',\n 'team_id',\n 'assignee_id',\n 'assignee_ids',\n 'start_date',\n 'due_date',\n 'label_ids',\n ], {\n project_id: 'projectId',\n milestone_id: 'milestoneId',\n team_id: 'teamId',\n assignee_id: 'assigneeId',\n assignee_ids: 'assigneeIds',\n start_date: 'startDate',\n due_date: 'dueDate',\n label_ids: 'labelIds',\n commentBody: 'comment_body',\n });\n}\n\nfunction pickDefined(args: ToolArgs, fields: string[], aliases: Record<string, string> = {}): Record<string, unknown> {\n const body: Record<string, unknown> = {};\n for (const field of fields) {\n if (args[field] !== undefined) {\n body[aliases[field] ?? field] = args[field];\n }\n }\n return body;\n}\n\nfunction nonEmptyBody(body: Record<string, unknown>): Record<string, unknown> {\n if (Object.keys(body).length === 0) {\n throw new Error('No fields to send. Provide at least one update/create field.');\n }\n return body;\n}\n\nfunction queryString(params?: Record<string, unknown>): string {\n if (!params) return '';\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null && value !== '') search.set(key, String(value));\n }\n const qs = search.toString();\n return qs ? `?${qs}` : '';\n}\n\nfunction assertSafeKpiHttpSyncSecretRef(value: string, label: string): void {\n if (!/^[A-Za-z][A-Za-z0-9_-]{0,39}$/.test(value)) {\n throw new Error(`${label} must be a short placeholder name, such as posthog_api_key, not a secret value.`);\n }\n if (looksLikeKpiHttpSyncSecretValue(value)) {\n throw new Error(`${label} looks like a secret value. Use a placeholder name and enter the secret in Atoll UI.`);\n }\n}\n\nfunction findUnsafeKpiHttpSyncString(value: unknown, path: string[]): { path: string } | null {\n if (typeof value === 'string') {\n if (path[path.length - 1] === 'format' && (value === 'Bearer {value}' || value === '{value}')) return null;\n if (looksLikeKpiHttpSyncSecretValue(value)) return { path: path.join('.') || '<root>' };\n return null;\n }\n if (Array.isArray(value)) {\n for (let index = 0; index < value.length; index += 1) {\n const found = findUnsafeKpiHttpSyncString(value[index], [...path, String(index)]);\n if (found) return found;\n }\n return null;\n }\n if (isObjectRecord(value)) {\n for (const [key, nested] of Object.entries(value)) {\n if (key === 'secretRef' && typeof nested === 'string') {\n assertSafeKpiHttpSyncSecretRef(nested, [...path, key].join('.'));\n continue;\n }\n const found = findUnsafeKpiHttpSyncString(nested, [...path, key]);\n if (found) return found;\n }\n }\n return null;\n}\n\nfunction looksLikeKpiHttpSyncSecretValue(value: string): boolean {\n const trimmed = value.trim();\n if (!trimmed) return false;\n if (/^Bearer\\s+\\S+/i.test(trimmed)) return true;\n if (/^sk_(?:atoll|live|test|proj)_[A-Za-z0-9_-]{8,}/.test(trimmed)) return true;\n if (/^(?:ghp|gho|github_pat|xox[baprs]|glpat)-?[A-Za-z0-9_-]{16,}/.test(trimmed)) return true;\n if (/^eyJ[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}\\.[A-Za-z0-9_-]{10,}$/.test(trimmed)) return true;\n if (/^(?:api[_-]?key|token|secret|password)\\s*[:=]\\s*\\S{8,}$/i.test(trimmed)) return true;\n if (/^[A-Za-z0-9+/=_-]{48,}$/.test(trimmed) && /[A-Z]/.test(trimmed) && /[a-z]/.test(trimmed) && /\\d/.test(trimmed)) {\n return true;\n }\n return false;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction requiredString(value: unknown, name: string): string {\n if (typeof value !== 'string' || value.length === 0) throw new Error(`${name} is required.`);\n return value;\n}\n\nfunction stringArg(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction numberArg(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction toolResult(data: unknown): CallToolResult {\n return {\n content: [{ type: 'text', text: JSON.stringify(data, null, 2) }],\n structuredContent: data as Record<string, unknown>,\n };\n}\n\nfunction toolError(error: unknown): CallToolResult {\n return {\n isError: true,\n content: [\n {\n type: 'text',\n text: `Error: ${(error as Error).message ?? String(error)}`,\n },\n ],\n };\n}\n","const DEFAULT_BASE_URL = 'https://atollhq.com';\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nexport interface AtollApiClientOptions {\n apiKey: string;\n baseUrl?: string;\n timeoutMs?: number;\n fetch?: typeof fetch;\n}\n\nexport interface AtollOrg {\n id: string;\n name?: string | null;\n slug?: string | null;\n}\n\nexport class AtollApiClient {\n readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly timeoutMs: number;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: AtollApiClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? process.env.ATOLL_BASE_URL ?? DEFAULT_BASE_URL;\n this.timeoutMs = options.timeoutMs ?? resolveTimeoutMs();\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n async request<T = unknown>(method: string, path: string, body?: unknown): Promise<T> {\n if (!path.startsWith('/')) {\n throw new Error('Atoll API paths must start with \"/\". Example: /api/orgs');\n }\n if (!path.startsWith('/api/')) {\n throw new Error('Atoll API paths must stay under /api/. Example: /api/orgs');\n }\n\n const headers: Record<string, string> = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n 'User-Agent': 'atoll-mcp-server',\n 'X-Atoll-Client': 'mcp-server',\n };\n\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: body === undefined ? undefined : JSON.stringify(body),\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n } catch (error) {\n if ((error as Error).name === 'TimeoutError' || (error as Error).name === 'AbortError') {\n throw new Error(`Atoll API request timed out after ${this.timeoutMs}ms: ${method} ${path}`);\n }\n throw error;\n }\n\n const text = await response.text();\n const parsed = parseResponseBody(text);\n\n if (!response.ok) {\n const details = typeof parsed === 'string' ? parsed : JSON.stringify(parsed);\n throw new Error(`Atoll API ${response.status} for ${method} ${path}: ${details}`);\n }\n\n return parsed as T;\n }\n\n get<T = unknown>(path: string): Promise<T> {\n return this.request<T>('GET', path);\n }\n\n post<T = unknown>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, body);\n }\n\n put<T = unknown>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PUT', path, body);\n }\n\n patch<T = unknown>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('PATCH', path, body);\n }\n\n delete<T = unknown>(path: string): Promise<T> {\n return this.request<T>('DELETE', path);\n }\n}\n\nexport function resolveAuthToken(authorizationHeader?: string): string {\n const requestToken = parseBearerToken(authorizationHeader);\n const token = requestToken ?? process.env.ATOLL_API_KEY;\n if (!token) {\n throw new Error(\n 'No Atoll API key available. Pass Authorization: Bearer <ATOLL_API_KEY> to the remote MCP server or set ATOLL_API_KEY for single-tenant deployments.',\n );\n }\n return token;\n}\n\nexport async function resolveOrgId(client: AtollApiClient, explicitOrgId?: string): Promise<string> {\n if (explicitOrgId) return explicitOrgId;\n if (process.env.ATOLL_ORG_ID) return process.env.ATOLL_ORG_ID;\n\n const data = await client.get<{ orgs?: AtollOrg[] }>('/api/orgs');\n const orgs = data.orgs ?? [];\n if (orgs.length === 1 && orgs[0]?.id) return orgs[0].id;\n if (orgs.length === 0) {\n throw new Error('No Atoll orgs are accessible for this API key. Create or join an org, then retry.');\n }\n\n const choices = orgs.map((org) => `${org.name ?? org.id} (${org.id})`).join(', ');\n throw new Error(`Multiple Atoll orgs are accessible. Pass org_id to choose one. Available orgs: ${choices}`);\n}\n\nexport function createClientFromAuth(authorizationHeader?: string): AtollApiClient {\n return new AtollApiClient({ apiKey: resolveAuthToken(authorizationHeader) });\n}\n\nexport function parseBearerToken(header?: string): string | undefined {\n if (!header) return undefined;\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim());\n if (!match) return undefined;\n return match[1];\n}\n\nfunction resolveTimeoutMs(): number {\n const raw = process.env.ATOLL_TIMEOUT_MS;\n if (!raw) return DEFAULT_TIMEOUT_MS;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_TIMEOUT_MS;\n}\n\nfunction parseResponseBody(text: string): unknown {\n if (!text) return undefined;\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n"],"mappings":"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","names":["server"]}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@atollhq/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "Atoll MCP server for remote agents and ChatGPT-compatible clients",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "atoll-mcp": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "README.md"
14
+ ],
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/antons-agents/atoll.git",
18
+ "directory": "packages/mcp-server"
19
+ },
20
+ "homepage": "https://atollhq.com",
21
+ "license": "MIT",
22
+ "keywords": [
23
+ "atoll",
24
+ "mcp",
25
+ "model-context-protocol",
26
+ "project-management",
27
+ "ai-agent"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "test": "bun test",
35
+ "prepublishOnly": "tsup"
36
+ },
37
+ "dependencies": {
38
+ "@modelcontextprotocol/sdk": "^1.27.1",
39
+ "zod": "^3.25.76"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^25.4.0",
43
+ "tsup": "^8.4.0",
44
+ "typescript": "^5.7.3"
45
+ }
46
+ }