submit_public_speaking
Submit a public speaking activity draft to the Activity Reporting MCP Server, including details like title, description, date, event format, attendees, and relevant URLs for accurate reporting and tracking.
Instructions
Submit a public speaking activity draft
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| activityDate | Yes | Date of your talk (YYYY-MM-DD format) | |
| activityUrl | Yes | Event link or relevant URL | |
| additionalInfo | No | Additional information (optional) | |
| country | No | Country (required if eventFormat is In-Person or Hybrid) | |
| description | Yes | What was it about? | |
| eventFormat | Yes | Select event format | |
| inPersonAttendees | No | In-person attendees (required if eventFormat is Hybrid or In-Person) | |
| metrics | Yes | ||
| private | No | Do you want to make this activity private? (optional) | |
| tags | No | Tags (optional) | |
| title | Yes | What was the title of your talk? |
Implementation Reference
- src/server.ts:609-682 (handler)The core handler function that executes the tool logic by sending a POST request to the Advocu API endpoint '/activity-drafts/public-speaking' with the provided draft data. Handles authentication, errors, and formats responses for MCP.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}` ); } }
- src/server.ts:143-215 (registration)Registers the 'submit_public_speaking' tool in the MCP server's listTools handler, including its name, description, and complete input schema.{ name: "submit_public_speaking", description: "Submit a public speaking activity draft", inputSchema: { type: "object", properties: { title: { type: "string", description: "What was the title of your talk?", minLength: 3, maxLength: 200, }, description: { type: "string", description: "What was it about?", maxLength: 2000, }, activityDate: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$", description: "Date of your talk (YYYY-MM-DD format)", }, tags: { type: "array", items: { type: "string" }, description: "Tags (optional)", minItems: 0, }, metrics: { type: "object", properties: { attendees: { type: "integer", minimum: 1, description: "How many people attended your session in total?", }, }, required: ["attendees"], }, eventFormat: { type: "string", enum: Object.values(EventFormat), description: "Select event format", }, country: { type: "string", enum: Object.values(Country), description: "Country (required if eventFormat is In-Person or Hybrid)", }, inPersonAttendees: { type: "integer", minimum: 0, description: "In-person attendees (required if eventFormat is Hybrid or In-Person)", }, activityUrl: { type: "string", maxLength: 500, pattern: "^https?://.*", description: "Event link or relevant URL", }, 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", "metrics", "eventFormat", "activityUrl"], }, },
- src/server.ts:578-579 (handler)Specific dispatch case in the CallToolRequestSchema handler that maps the tool call to the shared submitActivityDraft function with the appropriate endpoint and type casting.case "submit_public_speaking": return await this.submitActivityDraft("public-speaking", args as unknown as PublicSpeakingDraft);
- src/server.ts:146-214 (schema)Detailed input schema for the submit_public_speaking tool, defining validation rules for all parameters including required fields, types, enums, patterns, and constraints.inputSchema: { type: "object", properties: { title: { type: "string", description: "What was the title of your talk?", minLength: 3, maxLength: 200, }, description: { type: "string", description: "What was it about?", maxLength: 2000, }, activityDate: { type: "string", pattern: "^\\d{4}-\\d{2}-\\d{2}$", description: "Date of your talk (YYYY-MM-DD format)", }, tags: { type: "array", items: { type: "string" }, description: "Tags (optional)", minItems: 0, }, metrics: { type: "object", properties: { attendees: { type: "integer", minimum: 1, description: "How many people attended your session in total?", }, }, required: ["attendees"], }, eventFormat: { type: "string", enum: Object.values(EventFormat), description: "Select event format", }, country: { type: "string", enum: Object.values(Country), description: "Country (required if eventFormat is In-Person or Hybrid)", }, inPersonAttendees: { type: "integer", minimum: 0, description: "In-person attendees (required if eventFormat is Hybrid or In-Person)", }, activityUrl: { type: "string", maxLength: 500, pattern: "^https?://.*", description: "Event link or relevant URL", }, 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", "metrics", "eventFormat", "activityUrl"], },