#!/usr/bin/env node
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { VERSION } from './version.js';
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { tool_handler, list_of_tools } from './tool-handler.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
ListPromptsRequestSchema,
GetPromptRequestSchema,
ListResourcesRequestSchema,
ListResourceTemplatesRequestSchema,
ReadResourceRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";
import { AsanaClientWrapper } from './asana-client-wrapper.js'
import { createPromptHandlers } from './prompt-handler.js';
import { createResourceHandlers } from './resource-handler.js';
import { get_access_token } from './auth.js';
async function main() {
let asanaToken: string;
try {
asanaToken = await get_access_token();
} catch (error) {
console.error("Failed to get access token:", error);
console.error("Please configure Nango authentication with the required environment variables:");
console.error("- NANGO_CONNECTION_ID");
console.error("- NANGO_INTEGRATION_ID");
console.error("- NANGO_BASE_URL");
console.error("- NANGO_SECRET_KEY");
process.exit(1);
}
console.error("Starting Asana MCP Server...");
const server = new Server(
{
name: "Asana MCP Server",
version: VERSION,
},
{
capabilities: {
tools: {},
prompts: {},
resources: {}
},
}
);
const asanaClient = new AsanaClientWrapper(asanaToken);
console.error("Successfully authenticated with Asana");
server.setRequestHandler(
CallToolRequestSchema,
tool_handler(asanaClient)
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
console.error("Received ListToolsRequest");
return {
tools: list_of_tools,
};
});
const promptHandlers = createPromptHandlers(asanaClient);
// Add prompt handlers
server.setRequestHandler(ListPromptsRequestSchema, promptHandlers.listPrompts);
server.setRequestHandler(GetPromptRequestSchema, promptHandlers.getPrompt);
// Add resource handlers
const resourceHandlers = createResourceHandlers(asanaClient);
server.setRequestHandler(ListResourcesRequestSchema, resourceHandlers.listResources);
server.setRequestHandler(ListResourceTemplatesRequestSchema, resourceHandlers.listResourceTemplates);
server.setRequestHandler(ReadResourceRequestSchema, resourceHandlers.readResource);
const transport = new StdioServerTransport();
console.error("Connecting server to transport...");
await server.connect(transport);
console.error("Asana MCP Server running on stdio");
}
main().catch((error) => {
console.error("Fatal error in main():", error);
process.exit(1);
});