{
	"server": {
		"description": "AgentReacher MCP for connecting your AI to social media.",
		"name": "agentreacher",
		"title": "AgentReacher"
	},
	"tools": [
		{
			"description": "List all connected social media accounts for the active workspace. Use this to inspect which delivery targets are available there.",
			"input": {
				"properties": {},
				"required": [],
				"type": "object"
			},
			"name": "list_connected_social_accounts",
			"title": "List Connected Social Accounts",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Connected social accounts for the active workspace.",
				"properties": {
					"accounts": {
						"description": "Connected social accounts.",
						"items": {
							"additionalProperties": true,
							"description": "Connected social account/channel summary.",
							"properties": {
								"connected": {
									"type": "boolean"
								},
								"displayName": {
									"type": "string"
								},
								"id": {
									"type": "string"
								},
								"provider": {
									"type": "string"
								},
								"status": {
									"type": "string"
								}
							},
							"type": "object"
						},
						"type": "array"
					},
					"connectionProgress": {
						"additionalProperties": true,
						"description": "Connection progress summary when included.",
						"properties": {},
						"type": "object"
					},
					"workspace": {
						"additionalProperties": true,
						"description": "AgentReacher workspace summary.",
						"properties": {
							"id": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"slug": {
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Start the account connection flow for the current workspace. OAuth-based providers return an authorization URL. Bluesky returns a secure AgentReacher setup URL for entering the handle and app password outside the chat.",
			"input": {
				"properties": {
					"provider": {
						"description": "Social platform to connect.",
						"enum": [
							"bluesky",
							"instagram",
							"facebook",
							"x",
							"youtube",
							"tiktok",
							"pinterest",
							"linkedin",
							"threads"
						],
						"type": "string"
					}
				},
				"required": ["provider"],
				"type": "object"
			},
			"name": "connect_social_account",
			"title": "Connect Social Account",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Account connection flow or completed connection result.",
				"properties": {
					"action": {
						"additionalProperties": true,
						"description": "Optional UI action for opening a connection flow.",
						"properties": {},
						"type": "object"
					},
					"authorizationUrl": {
						"format": "url",
						"type": "string"
					},
					"channel": {
						"additionalProperties": true,
						"description": "Connected social account/channel summary.",
						"properties": {
							"connected": {
								"type": "boolean"
							},
							"displayName": {
								"type": "string"
							},
							"id": {
								"type": "string"
							},
							"provider": {
								"type": "string"
							},
							"status": {
								"type": "string"
							}
						},
						"type": "object"
					},
					"provider": {
						"type": "string"
					},
					"status": {
						"type": "string"
					},
					"url": {
						"format": "url",
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Disconnect a social account from the current workspace. If multiple accounts exist for the same provider, pass `channelId` from `list_connected_social_accounts`.",
			"input": {
				"properties": {
					"channelId": {
						"description": "Optional social channel ID to disconnect when multiple accounts exist for the provider. Get this from `list_connected_social_accounts`.",
						"type": "string"
					},
					"provider": {
						"description": "Social platform to disconnect.",
						"enum": [
							"bluesky",
							"instagram",
							"facebook",
							"x",
							"youtube",
							"tiktok",
							"pinterest",
							"linkedin",
							"threads"
						],
						"type": "string"
					}
				},
				"required": ["provider"],
				"type": "object"
			},
			"name": "disconnect_social_account",
			"title": "Disconnect Social Account",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Account disconnection result.",
				"properties": {
					"channel": {
						"additionalProperties": true,
						"description": "Connected social account/channel summary.",
						"properties": {
							"connected": {
								"type": "boolean"
							},
							"displayName": {
								"type": "string"
							},
							"id": {
								"type": "string"
							},
							"provider": {
								"type": "string"
							},
							"status": {
								"type": "string"
							}
						},
						"type": "object"
					},
					"provider": {
						"type": "string"
					},
					"status": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Create a post draft for one or more connected targets. Only call this after the user has chosen the caption text to use for the post, including an explicit empty caption; do not invent or generate a caption yourself. Use shared content first, then add per-target overrides only when delivery needs to differ.",
			"input": {
				"properties": {
					"content": {
						"description": "Shared post content used as the canonical source for all targets.",
						"properties": {
							"caption": {
								"description": "Exact caption text chosen by the user. This may be an empty string when the user explicitly wants no caption. If the user asks to create, schedule, or publish a post without providing or confirming the caption, ask them for the caption before calling create_post.",
								"maxLength": 63206,
								"type": "string"
							},
							"brief": {
								"description": "Optional internal label or high-level description for the post. Do not use this as a substitute for the user-supplied caption.",
								"maxLength": 2000,
								"type": "string"
							},
							"prompt": {
								"description": "Optional user-supplied note about the post. Do not use this to generate a caption.",
								"maxLength": 4000,
								"type": "string"
							}
						},
						"required": ["caption"],
						"type": "object"
					},
					"contentType": {
						"description": "Type of post to create. X, Bluesky, LinkedIn, Facebook, and Threads support `text`, one `image`, or one `video`. Instagram supports image/video posts and Instagram-only carousels. Pinterest supports image/video posts. TikTok supports image/video posts. YouTube Shorts supports `video` only.",
						"enum": ["text", "image", "video"],
						"type": "string"
					},
					"media": {
						"description": "Optional shared media settings. Upload/import media first and reuse the returned `assetId` when possible.",
						"properties": {
							"assetId": {
								"description": "Preferred shared media asset ID returned by `upload_media`.",
								"type": "string"
							},
							"items": {
								"description": "Optional media item list for Instagram-only carousels.",
								"items": {
									"properties": {
										"assetId": {
											"type": "string"
										},
										"assetUrl": {
											"format": "url",
											"type": "string"
										},
										"coverImageAssetId": {
											"type": "string"
										},
										"coverImageUrl": {
											"format": "url",
											"type": "string"
										},
										"mediaType": {
											"enum": ["image", "video"],
											"type": "string"
										}
									},
									"type": "object"
								},
								"type": "array"
							},
							"assetUrl": {
								"description": "Optional remote media URL. AgentReacher imports it into R2 before saving the post.",
								"format": "url",
								"type": "string"
							},
							"aspectRatio": {
								"description": "Optional aspect ratio hint for generated images.",
								"type": "string"
							},
							"style": {
								"description": "Optional style hint for generated images.",
								"type": "string"
							}
						},
						"type": "object"
					},
					"overrides": {
						"description": "Optional per-target overrides keyed by target/provider name or social channel key. Each target accepts { text?, mediaAssetId?, mediaUrl?, config? }. `config` is a power-user JSON object merged into the final provider publish payload. First-class fields include Pinterest `boardId`, YouTube `title`, TikTok `privacy`/`disableComments`/`disableDuet`/`disableStitch`/`brandContent`, and Instagram `igDisableComments`/`igShareToFeed`/`igCollaborators`/`igAltText`.",
						"type": "object"
					},
					"publishOptions": {
						"description": "Optional publishing settings such as a shared schedule.",
						"properties": {
							"scheduledAt": {
								"description": "Optional ISO 8601 datetime to schedule the post immediately after creation.",
								"format": "date-time",
								"type": "string"
							}
						},
						"type": "object"
					},
					"targets": {
						"description": "Connected targets to deliver this post to. Use a provider string for the default connected account, or { provider, channelId } to target a specific connected account from `list_connected_social_accounts`.",
						"items": {
							"anyOf": [
								{
									"enum": [
										"bluesky",
										"facebook",
										"instagram",
										"linkedin",
										"pinterest",
										"tiktok",
										"threads",
										"x",
										"youtube"
									],
									"type": "string"
								},
								{
									"properties": {
										"provider": {
											"enum": [
												"bluesky",
												"facebook",
												"instagram",
												"linkedin",
												"pinterest",
												"tiktok",
												"threads",
												"x",
												"youtube"
											],
											"type": "string"
										},
										"channelId": {
											"description": "Specific social channel ID from `list_connected_social_accounts`.",
											"type": "string"
										}
									},
									"required": ["provider", "channelId"],
									"type": "object"
								}
							]
						},
						"type": "array"
					}
				},
				"required": ["content", "contentType", "targets"],
				"type": "object"
			},
			"name": "create_post",
			"title": "Create Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Unified AgentReacher post summary.",
				"properties": {
					"content": {
						"additionalProperties": true,
						"description": "Shared post content.",
						"properties": {},
						"type": "object"
					},
					"contentType": {
						"type": "string"
					},
					"id": {
						"type": "string"
					},
					"media": {
						"additionalProperties": true,
						"description": "Post media settings.",
						"properties": {},
						"type": "object"
					},
					"overrides": {
						"additionalProperties": true,
						"description": "Per-target post overrides.",
						"properties": {},
						"type": "object"
					},
					"publishOptions": {
						"additionalProperties": true,
						"description": "Post publishing or scheduling options.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"targets": {
						"description": "Configured delivery targets.",
						"items": {},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Upload or import media into AgentReacher storage. Use `sourceUrl` for remote image/video URLs. Use base64 `content` only for tiny local files under 2 MB; for larger local files call `create_upload_url`, upload bytes to the returned `uploadUrl`, then reuse the returned `assetId` in `create_post.media.assetId`.",
			"input": {
				"properties": {
					"content": {
						"description": "Base64-encoded local image or video file content. Only use for files under 2 MB. For larger local files, call `create_upload_url` instead.",
						"type": "string"
					},
					"contentType": {
						"description": "MIME type of the base64 content. Supported: image/jpeg, image/png, image/webp, image/avif, image/gif, video/mp4, video/quicktime.",
						"type": "string"
					},
					"filename": {
						"description": "Original filename for base64 local file uploads. Used to infer contentType if not provided.",
						"type": "string"
					},
					"sourceUrl": {
						"description": "Remote image or video URL to import into AgentReacher storage instead of uploading local bytes.",
						"format": "url",
						"type": "string"
					}
				},
				"required": [],
				"type": "object"
			},
			"name": "upload_media",
			"title": "Upload Media",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Uploaded or imported media asset result.",
				"properties": {
					"asset": {
						"additionalProperties": true,
						"description": "Media asset record.",
						"properties": {},
						"type": "object"
					},
					"assetId": {
						"type": "string"
					},
					"sourceUrl": {
						"format": "url",
						"type": "string"
					},
					"url": {
						"format": "url",
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Create a direct upload URL for a local image/video file without placing bytes in the MCP tool arguments. Use this for local files over 2 MB, especially videos. Upload the file with PUT to `uploadUrl` using the returned `headers`, then pass `assetId` to `create_post.media.assetId`.",
			"input": {
				"properties": {
					"contentType": {
						"description": "MIME type of the file. Supported: image/jpeg, image/png, image/webp, image/avif, image/gif, video/mp4, video/quicktime.",
						"type": "string"
					},
					"fileSizeBytes": {
						"description": "Exact local file size in bytes.",
						"type": "number"
					},
					"filename": {
						"description": "Original filename.",
						"type": "string"
					}
				},
				"required": ["contentType", "fileSizeBytes"],
				"type": "object"
			},
			"name": "create_upload_url",
			"title": "Create Upload URL",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Direct upload reservation for an AgentReacher media asset.",
				"properties": {
					"assetId": {
						"type": "string"
					},
					"headers": {
						"additionalProperties": true,
						"description": "Headers to send with the direct upload request.",
						"properties": {},
						"type": "object"
					},
					"uploadUrl": {
						"format": "url",
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "List the Pinterest boards available on a connected Pinterest account. If the response includes `defaultBoardId`, use that board automatically. Otherwise use the returned board `id` in `overrides.pinterest.boardId` on `create_post` to target a specific board. Pinterest board selection is locked after a post is created; to move the same content to another board, create a new Pinterest post instead of updating boardId.",
			"input": {
				"properties": {
					"channelId": {
						"description": "Optional Pinterest social channel ID from `list_connected_social_accounts` when multiple Pinterest accounts are connected.",
						"type": "string"
					}
				},
				"required": [],
				"type": "object"
			},
			"name": "list_pinterest_boards",
			"title": "List Pinterest Boards",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Pinterest boards available to the selected connected account.",
				"properties": {
					"boards": {
						"description": "Pinterest boards.",
						"items": {
							"additionalProperties": true,
							"type": "object"
						},
						"type": "array"
					},
					"defaultBoardId": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Create a new Pinterest board on the connected Pinterest account. Use when `list_pinterest_boards` returns no boards, or the user asks for a new board. Returns the created board `id` which can be passed to `create_post` via `overrides.pinterest.boardId`.",
			"input": {
				"properties": {
					"name": {
						"description": "Board name. Required.",
						"type": "string"
					},
					"description": {
						"description": "Optional board description.",
						"type": "string"
					},
					"privacy": {
						"description": "Board privacy. Defaults to PUBLIC if omitted.",
						"enum": ["PUBLIC", "SECRET", "PROTECTED"],
						"type": "string"
					},
					"channelId": {
						"description": "Optional Pinterest social channel ID from `list_connected_social_accounts` when multiple Pinterest accounts are connected.",
						"type": "string"
					}
				},
				"required": ["name"],
				"type": "object"
			},
			"name": "create_pinterest_board",
			"title": "Create Pinterest Board",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Created Pinterest board result.",
				"properties": {
					"board": {
						"additionalProperties": true,
						"description": "Pinterest board returned by AgentReacher or Pinterest.",
						"properties": {},
						"type": "object"
					},
					"id": {
						"type": "string"
					},
					"name": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Set or change when a post should publish. Apply one shared schedule or provide target-specific schedules when delivery times differ.",
			"input": {
				"properties": {
					"postId": {
						"description": "The unified post ID returned by AgentReacher.",
						"type": "string"
					},
					"publishOptions": {
						"description": "Scheduling options, including a shared `scheduledAt` value or per-target `targetSchedules`.",
						"properties": {
							"scheduledAt": {
								"description": "Shared ISO 8601 datetime to apply to the full post or the selected `targets`.",
								"format": "date-time",
								"type": "string"
							},
							"targetSchedules": {
								"description": "Optional map of target -> ISO 8601 datetime, or null to clear a target-specific schedule.",
								"type": "object"
							}
						},
						"type": "object"
					},
					"targets": {
						"description": "Optional subset of targets to apply the shared schedule to.",
						"items": {
							"enum": [
								"bluesky",
								"facebook",
								"instagram",
								"linkedin",
								"pinterest",
								"tiktok",
								"threads",
								"x",
								"youtube"
							],
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": ["postId", "publishOptions"],
				"type": "object"
			},
			"name": "schedule_post",
			"title": "Schedule Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Unified AgentReacher post summary.",
				"properties": {
					"content": {
						"additionalProperties": true,
						"description": "Shared post content.",
						"properties": {},
						"type": "object"
					},
					"contentType": {
						"type": "string"
					},
					"id": {
						"type": "string"
					},
					"media": {
						"additionalProperties": true,
						"description": "Post media settings.",
						"properties": {},
						"type": "object"
					},
					"overrides": {
						"additionalProperties": true,
						"description": "Per-target post overrides.",
						"properties": {},
						"type": "object"
					},
					"publishOptions": {
						"additionalProperties": true,
						"description": "Post publishing or scheduling options.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"targets": {
						"description": "Configured delivery targets.",
						"items": {},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Publish a post immediately across its current targets.",
			"input": {
				"properties": {
					"postId": {
						"description": "The unified post ID returned by AgentReacher.",
						"type": "string"
					}
				},
				"required": ["postId"],
				"type": "object"
			},
			"name": "publish_post_now",
			"title": "Publish Post Now",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Unified AgentReacher post summary.",
				"properties": {
					"content": {
						"additionalProperties": true,
						"description": "Shared post content.",
						"properties": {},
						"type": "object"
					},
					"contentType": {
						"type": "string"
					},
					"id": {
						"type": "string"
					},
					"media": {
						"additionalProperties": true,
						"description": "Post media settings.",
						"properties": {},
						"type": "object"
					},
					"overrides": {
						"additionalProperties": true,
						"description": "Per-target post overrides.",
						"properties": {},
						"type": "object"
					},
					"publishOptions": {
						"additionalProperties": true,
						"description": "Post publishing or scheduling options.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"targets": {
						"description": "Configured delivery targets.",
						"items": {},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "List recent posts for the active workspace, including drafts, scheduled posts, in-flight publishes, and completed deliveries.",
			"input": {
				"properties": {
					"limit": {
						"description": "Maximum number of posts to return. Defaults to 25; max 100.",
						"maximum": 100,
						"minimum": 1,
						"type": "number"
					}
				},
				"required": [],
				"type": "object"
			},
			"name": "list_posts",
			"title": "List Posts",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Recent posts for the active workspace.",
				"properties": {
					"posts": {
						"description": "Unified posts.",
						"items": {
							"additionalProperties": true,
							"description": "Unified AgentReacher post summary.",
							"properties": {
								"content": {
									"additionalProperties": true,
									"description": "Shared post content.",
									"properties": {},
									"type": "object"
								},
								"contentType": {
									"type": "string"
								},
								"id": {
									"type": "string"
								},
								"media": {
									"additionalProperties": true,
									"description": "Post media settings.",
									"properties": {},
									"type": "object"
								},
								"overrides": {
									"additionalProperties": true,
									"description": "Per-target post overrides.",
									"properties": {},
									"type": "object"
								},
								"publishOptions": {
									"additionalProperties": true,
									"description": "Post publishing or scheduling options.",
									"properties": {},
									"type": "object"
								},
								"status": {
									"type": "string"
								},
								"targets": {
									"description": "Configured delivery targets.",
									"items": {},
									"type": "array"
								}
							},
							"type": "object"
						},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Inspect one post and its delivery status across targets in the active workspace.",
			"input": {
				"properties": {
					"postId": {
						"description": "The unified post ID returned by AgentReacher.",
						"type": "string"
					}
				},
				"required": ["postId"],
				"type": "object"
			},
			"name": "get_post",
			"title": "Get Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Unified AgentReacher post summary.",
				"properties": {
					"content": {
						"additionalProperties": true,
						"description": "Shared post content.",
						"properties": {},
						"type": "object"
					},
					"contentType": {
						"type": "string"
					},
					"id": {
						"type": "string"
					},
					"media": {
						"additionalProperties": true,
						"description": "Post media settings.",
						"properties": {},
						"type": "object"
					},
					"overrides": {
						"additionalProperties": true,
						"description": "Per-target post overrides.",
						"properties": {},
						"type": "object"
					},
					"publishOptions": {
						"additionalProperties": true,
						"description": "Post publishing or scheduling options.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"targets": {
						"description": "Configured delivery targets.",
						"items": {},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Update a post. Published targets are edited live when their platform API supports it; target selection and scheduling remain locked after publish. Do not use update_post to change a Pinterest boardId after the post exists; create a new Pinterest post with the desired overrides.pinterest.boardId instead.",
			"input": {
				"properties": {
					"content": {
						"description": "Updated shared content fields.",
						"properties": {
							"brief": {
								"description": "Updated high-level brief for the post.",
								"maxLength": 2000,
								"type": "string"
							},
							"prompt": {
								"description": "Updated writing or generation instructions.",
								"maxLength": 4000,
								"type": "string"
							}
						},
						"type": "object"
					},
					"media": {
						"description": "Updated shared media fields. Prefer `assetId`; `assetUrl` is imported into R2 automatically.",
						"properties": {
							"assetId": {
								"description": "Updated shared asset ID for the post.",
								"type": "string"
							},
							"items": {
								"description": "Optional replacement media item list for Instagram-only carousels.",
								"items": {
									"properties": {
										"assetId": {
											"type": "string"
										},
										"assetUrl": {
											"format": "url",
											"type": "string"
										},
										"coverImageAssetId": {
											"type": "string"
										},
										"coverImageUrl": {
											"format": "url",
											"type": "string"
										},
										"mediaType": {
											"enum": ["image", "video"],
											"type": "string"
										}
									},
									"type": "object"
								},
								"type": "array"
							},
							"assetUrl": {
								"description": "Updated shared asset URL for the post.",
								"format": "url",
								"type": "string"
							}
						},
						"type": "object"
					},
					"overrides": {
						"description": "Optional per-target overrides keyed by target/provider name or social channel key. Each target accepts { text?, mediaAssetId?, mediaUrl?, config? }. `config` is a power-user JSON object merged into the final provider publish payload. First-class fields include Pinterest `boardId`, YouTube `title`, TikTok `privacy`/`disableComments`/`disableDuet`/`disableStitch`/`brandContent`, and Instagram `igDisableComments`/`igShareToFeed`/`igCollaborators`/`igAltText`.",
						"type": "object"
					},
					"postId": {
						"description": "The unified post ID returned by AgentReacher.",
						"type": "string"
					},
					"publishOptions": {
						"description": "Updated publishing settings for the post.",
						"properties": {
							"scheduledAt": {
								"description": "Updated shared schedule for the post.",
								"format": "date-time",
								"type": "string"
							}
						},
						"type": "object"
					},
					"targets": {
						"description": "Updated set of delivery target providers. Specific channel changes are only supported when creating a new post.",
						"items": {
							"enum": [
								"bluesky",
								"facebook",
								"instagram",
								"linkedin",
								"pinterest",
								"tiktok",
								"threads",
								"x",
								"youtube"
							],
							"type": "string"
						},
						"type": "array"
					}
				},
				"required": ["postId"],
				"type": "object"
			},
			"name": "update_post",
			"title": "Update Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Unified AgentReacher post summary.",
				"properties": {
					"content": {
						"additionalProperties": true,
						"description": "Shared post content.",
						"properties": {},
						"type": "object"
					},
					"contentType": {
						"type": "string"
					},
					"id": {
						"type": "string"
					},
					"media": {
						"additionalProperties": true,
						"description": "Post media settings.",
						"properties": {},
						"type": "object"
					},
					"overrides": {
						"additionalProperties": true,
						"description": "Per-target post overrides.",
						"properties": {},
						"type": "object"
					},
					"publishOptions": {
						"additionalProperties": true,
						"description": "Post publishing or scheduling options.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"targets": {
						"description": "Configured delivery targets.",
						"items": {},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Delete a post from AgentReacher. This removes the post record regardless of status, but does not remove already-published content from the social platform itself.",
			"input": {
				"properties": {
					"postId": {
						"description": "The unified post ID returned by AgentReacher.",
						"type": "string"
					}
				},
				"required": ["postId"],
				"type": "object"
			},
			"name": "delete_post",
			"title": "Delete Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Post deletion result.",
				"properties": {
					"deleted": {
						"type": "boolean"
					},
					"postId": {
						"type": "string"
					},
					"status": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Attach an ordered chain of replies to an existing post. When the parent publishes, each reply is posted as a follow-up from the same connected account on every channel the parent targets, chained so each reply targets the previous one (true thread on X, Bluesky, etc.). Replies are text-only and inherit the parent's targets and schedule. Pinterest, TikTok, and YouTube do not support reply chains and will skip the chain.",
			"input": {
				"properties": {
					"postId": {
						"description": "Parent post ID returned by AgentReacher. Must be a top-level post, not itself a reply.",
						"type": "string"
					},
					"replies": {
						"description": "Ordered list of reply drafts. The first item becomes the reply to the parent; each subsequent item replies to the previous reply in the chain.",
						"items": {
							"properties": {
								"text": {
									"description": "Reply text. Must be non-empty and respect each target platform's caption limit.",
									"type": "string"
								}
							},
							"required": ["text"],
							"type": "object"
						},
						"minItems": 1,
						"type": "array"
					},
					"replaceExisting": {
						"description": "If true, deletes any existing replies on the parent before appending these. Defaults to false (append).",
						"type": "boolean"
					}
				},
				"required": ["postId", "replies"],
				"type": "object"
			},
			"name": "add_replies_to_post",
			"title": "Add Replies To Post",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Reply chain update result.",
				"properties": {
					"postId": {
						"type": "string"
					},
					"replies": {
						"description": "Reply drafts attached to the parent post.",
						"items": {
							"additionalProperties": true,
							"type": "object"
						},
						"type": "array"
					},
					"status": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "List the workspaces available to the current account so the agent can understand its operating context.",
			"input": {
				"properties": {},
				"required": [],
				"type": "object"
			},
			"name": "list_workspaces",
			"title": "List Workspaces",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspaces available to the current account.",
				"properties": {
					"activeWorkspaceId": {
						"type": "string"
					},
					"workspaces": {
						"description": "Available workspaces.",
						"items": {
							"additionalProperties": true,
							"description": "AgentReacher workspace summary.",
							"properties": {
								"id": {
									"type": "string"
								},
								"name": {
									"type": "string"
								},
								"slug": {
									"type": "string"
								}
							},
							"type": "object"
						},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Create a new workspace and make it the active MCP workspace for later tools.",
			"input": {
				"properties": {
					"name": {
						"description": "Name for the new workspace.",
						"type": "string"
					}
				},
				"required": ["name"],
				"type": "object"
			},
			"name": "create_workspace",
			"title": "Create Workspace",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspace creation result.",
				"properties": {
					"created": {
						"type": "boolean"
					},
					"workspace": {
						"additionalProperties": true,
						"description": "AgentReacher workspace summary.",
						"properties": {
							"id": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"slug": {
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Delete a workspace. Defaults to the active workspace when `workspaceId` is omitted. This is blocked when it is the only workspace the user belongs to. After deletion, MCP switches to another remaining workspace automatically.",
			"input": {
				"properties": {
					"workspaceId": {
						"description": "Optional workspace ID to delete. Defaults to the active MCP workspace.",
						"type": "string"
					}
				},
				"required": [],
				"type": "object"
			},
			"name": "delete_workspace",
			"title": "Delete Workspace",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspace deletion result.",
				"properties": {
					"deleted": {
						"type": "boolean"
					},
					"workspace": {
						"additionalProperties": true,
						"description": "AgentReacher workspace summary.",
						"properties": {
							"id": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"slug": {
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Switch the MCP session to a different workspace so later tools operate in that workspace context.",
			"input": {
				"properties": {
					"workspaceId": {
						"description": "Workspace ID to switch the MCP session into.",
						"type": "string"
					}
				},
				"required": ["workspaceId"],
				"type": "object"
			},
			"name": "switch_workspace",
			"title": "Switch Workspace",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspace switch result.",
				"properties": {
					"switched": {
						"type": "boolean"
					},
					"workspace": {
						"additionalProperties": true,
						"description": "AgentReacher workspace summary.",
						"properties": {
							"id": {
								"type": "string"
							},
							"name": {
								"type": "string"
							},
							"slug": {
								"type": "string"
							}
						},
						"type": "object"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Invite someone to the active workspace by email.",
			"input": {
				"properties": {
					"email": {
						"description": "Email address of the person to invite.",
						"format": "email",
						"type": "string"
					},
					"role": {
						"description": "Role to assign. Currently only 'member' is supported.",
						"enum": ["member"],
						"default": "member",
						"type": "string"
					}
				},
				"required": ["email"],
				"type": "object"
			},
			"name": "invite_team_member",
			"title": "Invite Team Member",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspace invitation result.",
				"properties": {
					"invitation": {
						"additionalProperties": true,
						"description": "Created invitation.",
						"properties": {},
						"type": "object"
					},
					"invited": {
						"type": "boolean"
					},
					"status": {
						"type": "string"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "List current workspace members and any pending invitations for the active workspace.",
			"input": {
				"properties": {},
				"required": [],
				"type": "object"
			},
			"name": "list_members",
			"title": "List Members",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Workspace members and pending invitations.",
				"properties": {
					"invitations": {
						"description": "Pending workspace invitations.",
						"items": {
							"additionalProperties": true,
							"type": "object"
						},
						"type": "array"
					},
					"members": {
						"description": "Current workspace members.",
						"items": {
							"additionalProperties": true,
							"type": "object"
						},
						"type": "array"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Send product feedback or workflow issues directly to the AgentReacher team.",
			"input": {
				"properties": {
					"category": {
						"description": "Feedback category to help route the message.",
						"enum": ["bug", "idea", "ux", "onboarding", "other"],
						"type": "string"
					},
					"contactEmail": {
						"description": "Optional reply email if the user wants a follow-up outside the agent session.",
						"format": "email",
						"type": "string"
					},
					"message": {
						"description": "The feedback message to send to AgentReacher.",
						"maxLength": 4000,
						"minLength": 10,
						"type": "string"
					}
				},
				"required": ["message"],
				"type": "object"
			},
			"name": "submit_feedback",
			"title": "Send Feedback To AgentReacher",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Feedback submission result.",
				"properties": {
					"feedback": {
						"additionalProperties": true,
						"description": "Saved feedback record when returned.",
						"properties": {},
						"type": "object"
					},
					"status": {
						"type": "string"
					},
					"submitted": {
						"type": "boolean"
					}
				},
				"type": "object"
			}
		}
	],
	"disabled_tools": [
		{
			"description": "Get analytics for a connected social channel. Returns normalized summary scalars (likes, comments, impressions, reach, follower_count, etc.) plus the raw per-metric time series. Supports facebook, instagram, youtube, pinterest, tiktok, threads.",
			"input": {
				"properties": {
					"channelId": {
						"description": "The AgentReacher social channel ID (from list_connected_social_accounts).",
						"type": "string"
					},
					"days": {
						"default": 30,
						"description": "Lookback window in days (1-90). Clamped per-platform; effective value reported in meta.effectiveDays.",
						"maximum": 90,
						"minimum": 1,
						"type": "integer"
					}
				},
				"required": ["channelId"],
				"type": "object"
			},
			"name": "get_channel_analytics",
			"title": "Get Channel Analytics",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Channel-level analytics. summary holds canonical-keyed totals for cross-platform comparison; series holds the raw labeled time series for charting; meta.scopeMissing=true means the channel needs to be reconnected for the analytics scope.",
				"properties": {
					"meta": {
						"additionalProperties": true,
						"properties": {
							"cacheTtlSeconds": { "type": "number" },
							"cachedAt": { "type": "string" },
							"effectiveDays": { "type": "number" },
							"missingScopes": {
								"items": { "type": "string" },
								"type": "array"
							},
							"provider": { "type": "string" },
							"requestedDays": { "type": "number" },
							"scopeMissing": { "type": "boolean" }
						},
						"type": "object"
					},
					"series": {
						"items": {
							"additionalProperties": true,
							"properties": {
								"canonicalKey": { "type": "string" },
								"data": {
									"items": {
										"additionalProperties": true,
										"properties": {
											"date": { "type": "string" },
											"total": { "type": "number" }
										},
										"type": "object"
									},
									"type": "array"
								},
								"label": { "type": "string" },
								"percentageChange": { "type": "number" }
							},
							"type": "object"
						},
						"type": "array"
					},
					"summary": {
						"additionalProperties": true,
						"properties": {
							"clicks": { "type": "number" },
							"comments": { "type": "number" },
							"engagement_rate": { "type": "number" },
							"follower_count": { "type": "number" },
							"impressions": { "type": "number" },
							"likes": { "type": "number" },
							"reach": { "type": "number" },
							"shares": { "type": "number" },
							"video_views": { "type": "number" }
						},
						"type": "object"
					}
				},
				"type": "object"
			}
		},
		{
			"description": "Get analytics for a single published post by AgentReacher post ID. Returns current totals (likes, comments, impressions, etc.) for the post on its platform. Supports facebook, instagram, youtube, pinterest, tiktok, threads.",
			"input": {
				"properties": {
					"postId": {
						"description": "The AgentReacher post (publication) ID from list_posts or get_post.",
						"type": "string"
					},
					"sincePublish": {
						"description": "Optional lookback in days since publish for platforms that support it. Most platforms return lifetime totals regardless.",
						"minimum": 1,
						"type": "integer"
					}
				},
				"required": ["postId"],
				"type": "object"
			},
			"name": "get_post_analytics",
			"title": "Get Post Analytics",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Post-level analytics. Same shape as get_channel_analytics.",
				"properties": {
					"meta": {
						"additionalProperties": true,
						"properties": {},
						"type": "object"
					},
					"series": {
						"items": { "additionalProperties": true, "type": "object" },
						"type": "array"
					},
					"summary": { "additionalProperties": true, "type": "object" }
				},
				"type": "object"
			}
		},
		{
			"description": "List published posts in a date range with their summary analytics (totals only, no time series). Use this to rank top performers, compare engagement across posts, or identify under-performers without making N separate calls.",
			"input": {
				"properties": {
					"channelId": {
						"description": "Optional: restrict to one channel.",
						"type": "string"
					},
					"from": {
						"description": "Optional ISO date for range start. Defaults to 30 days ago.",
						"type": "string"
					},
					"limit": {
						"default": 20,
						"description": "Max posts to return (1-50).",
						"maximum": 50,
						"minimum": 1,
						"type": "integer"
					},
					"provider": {
						"description": "Optional: restrict to one provider (facebook, instagram, youtube, pinterest, tiktok, threads).",
						"type": "string"
					},
					"to": {
						"description": "Optional ISO date for range end. Defaults to now.",
						"type": "string"
					}
				},
				"required": [],
				"type": "object"
			},
			"name": "list_post_analytics",
			"title": "List Post Analytics",
			"outputSchema": {
				"additionalProperties": true,
				"description": "Posts in range with summary metrics each.",
				"properties": {
					"meta": {
						"additionalProperties": true,
						"properties": {
							"channelId": { "type": ["string", "null"] },
							"from": { "type": "string" },
							"limit": { "type": "number" },
							"provider": { "type": ["string", "null"] },
							"to": { "type": "string" }
						},
						"type": "object"
					},
					"posts": {
						"items": {
							"additionalProperties": true,
							"properties": {
								"permalink": { "type": ["string", "null"] },
								"postId": { "type": "string" },
								"provider": { "type": "string" },
								"publishedAt": { "type": "string" },
								"summary": { "additionalProperties": true, "type": "object" }
							},
							"type": "object"
						},
						"type": "array"
					}
				},
				"type": "object"
			}
		}
	]
}
