Skip to main content
Glama

submit_product_feedback

Submit a product feedback activity draft to the Activity Reporting MCP Server. Capture details like title, description, activity date, product details, and time spent for efficient reporting.

Instructions

Submit a product feedback activity draft

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
activityDateYesParticipation Date (YYYY-MM-DD format)
additionalInfoNoAdditional information (optional)
contentTypeYesContent type
descriptionYesDescription
metricsYes
privateNoDo you want to make this activity private? (optional)
productDescriptionYesWhat product was it about?
tagsNoTags (optional)
titleYesTitle

Implementation Reference

  • src/server.ts:362-423 (registration)
    Registration of the 'submit_product_feedback' tool in the ListToolsRequestSchema handler, including detailed input schema definition.
    { name: "submit_product_feedback", description: "Submit a product feedback activity draft", inputSchema: { type: "object", properties: { title: { type: "string", description: "Title", minLength: 3, maxLength: 200, }, description: { type: "string", description: "Description", maxLength: 2000, }, activityDate: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$", description: "Participation Date (YYYY-MM-DD format)", }, contentType: { type: "string", enum: Object.values(ProductFeedbackContentType), description: "Content type", }, productDescription: { type: "string", maxLength: 500, description: "What product was it about?", }, tags: { type: "array", items: { type: "string" }, description: "Tags (optional)", minItems: 0, }, metrics: { type: "object", properties: { timeSpent: { type: "integer", minimum: 1, description: "Time spent (in minutes)", }, }, required: ["timeSpent"], }, additionalInfo: { type: "string", maxLength: 2000, description: "Additional information (optional)", }, private: { type: "boolean", description: "Do you want to make this activity private? (optional)", }, }, required: ["title", "description", "activityDate", "contentType", "productDescription", "metrics"], }, },
  • Handler dispatch in the CallToolRequestSchema switch statement, mapping the tool call to the shared submitActivityDraft method with specific endpoint 'product-feedback-given'.
    case "submit_product_feedback": return await this.submitActivityDraft("product-feedback-given", args as unknown as ProductFeedbackDraft);
  • Shared helper function that executes the core logic: POSTs the product feedback draft to the 'product-feedback-given' endpoint on the Advocu GDE API, handles responses and errors.
    private async submitActivityDraft( endpoint: string, data: | ContentCreationDraft | PublicSpeakingDraft | WorkshopDraft | MentoringDraft | ProductFeedbackDraft | GooglerInteractionDraft | StoryDraft, ): Promise<{ content: Array<{ type: string; text: string; }>; }> { const url = `${this.baseUrl}/activity-drafts/${endpoint}`; try { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${this.accessToken}`, }, body: JSON.stringify(data), }); if (!response.ok) { const errorText = await response.text(); let errorMessage = `GDE API error (${response.status})`; if (response.status === 401) { errorMessage = "❌ GDE authentication failed. Your ADVOCU_ACCESS_TOKEN may be expired or invalid.\n\nPlease check your Advocu access token configuration."; } else if (response.status === 400) { errorMessage = `❌ GDE API rejected the request:\n\n${errorText}\n\nPlease check:\n- All required fields are present\n- Field values match expected formats\n- Tags are valid\n- Date format is correct (YYYY-MM-DD)`; } else if (response.status === 429) { errorMessage = "⏱️ GDE API rate limit exceeded (30 requests/minute). Please wait and try again."; } else { errorMessage = `❌ GDE API error (${response.status}):\n\n${errorText}`; } // Return error as content instead of throwing return { content: [ { type: "text", text: errorMessage, }, ], }; } const result = (await response.json()) as Record<string, unknown>; return { content: [ { type: "text", text: `✅ GDE Activity draft submitted successfully!\n\nEndpoint: ${endpoint}\nStatus: ${response.status}\nResponse: ${JSON.stringify(result, null, 2)}`, }, ], }; } catch (error) { if (error instanceof McpError) { throw error; } const errorMsg = this.getErrorMessage(error); throw new McpError( ErrorCode.InternalError, `❌ Failed to submit GDE activity:\n\n${errorMsg}\n\nEndpoint: ${endpoint}` ); } }
  • Type definition for ProductFeedbackDraft, providing structure and validation types for the tool's input parameters.
    export interface ProductFeedbackDraft extends ActivityDraftBase { /** Type of product feedback content */ contentType: ProductFeedbackContentType; /** Description of what product the feedback was about */ productDescription: string; /** Metrics related to time investment */ metrics: { /** Time spent providing feedback (in minutes) */ timeSpent: number; }; }
  • Enum defining valid values for the 'contentType' field in the product feedback tool schema.
    export enum ProductFeedbackContentType { EARLY_ACCESS_PROGRAM = "Early access program", PRODUCT_FEEDBACK_SESSION = "Product feedback session", }

Other Tools

Related Tools

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/carlosazaustre/advocu-mcp-server'

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