Skip to main content
Glama

asana_create_task_story

Add comments or stories to Asana tasks using plain text or formatted HTML with supported tags to document progress and communicate updates.

Instructions

Create a comment or story on a task. Either text or html_text is required.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
task_idYesThe task ID to add the story to
textNoThe plain text content of the story/comment. Required if html_text is not provided.
html_textNoHTML-like formatted text for the comment. Required if text is not provided. Does not support ALL HTML tags. Only a subset. The only allowed TAG in the HTML are: <body> <h1> <h2> <ol> <ul> <li> <strong> <em> <u> <s> <code> <pre> <blockquote> <a data-asana-type="" data-asana-gid=""> <hr> <img> <table> <tr> <td>. No other tags are allowed. Use the \n to create a newline. Do not use \n after <body>.
opt_fieldsNoComma-separated list of optional fields to include

Implementation Reference

  • Handler implementation for the 'asana_create_task_story' tool. Validates HTML text if provided, calls the Asana client wrapper to create the story, and provides detailed error handling including XML validation feedback.
    case "asana_create_task_story": {
      const { task_id, text, html_text, ...opts } = args;
    
      try {
        // Validate if html_text is provided
        if (html_text) {
          const xmlValidationErrors = validateAsanaXml(html_text);
          if (xmlValidationErrors.length > 0) {
            return {
              content: [{
                type: "text",
                text: JSON.stringify({
                  error: "HTML validation failed",
                  validation_errors: xmlValidationErrors,
                  message: "The HTML text contains invalid XML formatting. Please check the validation errors above."
                })
              }],
            };
          }
        }
    
        const response = await asanaClient.createTaskStory(task_id, text, opts, html_text);
        return {
          content: [{ type: "text", text: JSON.stringify(response) }],
        };
      } catch (error) {
        // When error occurs and html_text was provided, help troubleshoot
        if (html_text && error instanceof Error && error.message.includes('400')) {
          return {
            content: [{
              type: "text",
              text: JSON.stringify({
                error: error instanceof Error ? error.message : String(error),
                html_text_validation: "The HTML format is valid. The error must be related to something else in the API request."
              })
            }],
          };
        }
        throw error; // re-throw to be caught by the outer try/catch
      }
    }
  • Schema definition for the 'asana_create_task_story' tool, including name, description, and detailed input schema.
    export const createTaskStoryTool: Tool = {
      name: "asana_create_task_story",
      description: "Create a comment or story on a task. Either text or html_text is required.",
      inputSchema: {
        type: "object",
        properties: {
          task_id: {
            type: "string",
            description: "The task ID to add the story to"
          },
          text: {
            type: "string",
            description: "The plain text content of the story/comment. Required if html_text is not provided."
          },
          html_text: {
            type: "string",
            description: "HTML-like formatted text for the comment. Required if text is not provided. Does not support ALL HTML tags. Only a subset. The only allowed TAG in the HTML are: <body> <h1> <h2> <ol> <ul> <li> <strong> <em> <u> <s> <code> <pre> <blockquote> <a data-asana-type=\"\" data-asana-gid=\"\"> <hr> <img> <table> <tr> <td>. No other tags are allowed. Use the \\n to create a newline. Do not use \\n after <body>."
          },
          opt_fields: {
            type: "string",
            description: "Comma-separated list of optional fields to include"
          }
        },
        required: ["task_id"]
      }
    };
  • Helper method in AsanaClientWrapper that implements the core logic for creating a task story by calling the Asana Stories API.
    async createTaskStory(taskId: string, text: string | null = null, opts: any = {}, html_text: string | null = null) {
      const options = opts.opt_fields ? opts : {};
      const data: any = {};
    
      if (text) {
        data.text = text;
      } else if (html_text) {
        data.html_text = html_text;
      } else {
        throw new Error("Either text or html_text must be provided");
      }
    
      const body = { data };
      const response = await this.stories.createStoryForTask(body, taskId, options);
      return response.data;
    }
  • Registration of the 'asana_create_task_story' tool (included as createTaskStoryTool) in the all_tools array, which is filtered based on read-only mode and exported as list_of_tools for the MCP server.
    const all_tools: Tool[] = [
      listWorkspacesTool,
      searchProjectsTool,
      searchTasksTool,
      getTaskTool,
      createTaskTool,
      getStoriesForTaskTool,
      updateTaskTool,
      getProjectTool,
      getProjectTaskCountsTool,
      getProjectSectionsTool,
      createTaskStoryTool,
      addTaskDependenciesTool,
      addTaskDependentsTool,
      createSubtaskTool,
      getMultipleTasksByGidTool,
      getProjectStatusTool,
      getProjectStatusesForProjectTool,
      createProjectStatusTool,
      deleteProjectStatusTool,
      setParentForTaskTool,
      getTasksForTagTool,
      getTagsForWorkspaceTool,
    ];

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/roychri/mcp-server-asana'

If you have feedback or need assistance with the MCP directory API, please join our Discord server