@island-pitch/ip-bot-mcp
v0.3.0
Published
IP Bot MCP Server — accessible-by-default social publishing tools for AI agents (Model Context Protocol): alt text as a first-class param, human-in-the-loop approval
Maintainers
Readme
@island-pitch/ip-bot-mcp
#AutomateThis — give your agent a content crew. 40+ MCP tools that let Claude (or any MCP client) draft, get human approval, schedule, publish, and measure social content — with accessibility and the deep Meta publishing features built in. Do Cool Things the Right Way!®
# Claude Code — one command:
claude mcp add ip-bot -e IPBOT_APPSYNC_ENDPOINT=https://api.islandpitch.bot/graphql \
-e IPBOT_API_KEY=ipbot_live_… -- npx -y @island-pitch/ip-bot-mcpThen just ask: "Draft Friday's show announcement for @islandpitch.bot with alt
text and the venue tagged, get it reviewed, and schedule it for 7pm." The
agent uses create_content_draft → submit_for_review → (a human approves) →
schedule_publication — and wait_for_schedule confirms it went live.
Why agents love this surface
- Nothing publishes without a human. The approval gate is in the platform, not the prompt — agents draft and schedule; people decide.
- Accessible by default.
create_content_drafttreatsaltTextas a first-class param and the tool descriptions steer agents to always provide it. Every image ships with a screen-reader description. - The Meta features everyone else skips, as plain params: venue
locationId,collaboratorsco-author invites for the featured accounts,userTags, Reels presentation, IG Stories, Facebook CTA buttons, 21+targetingfor compliance content,backdatedTime. - Agent-grade ergonomics. Idempotent creates (
externalRef), natural-language scheduling, typed{error: {code, message}}failures,upload_mediafor native image hosting,schedule_debugthat reads the publisher's logs and suggests the fix, andsystem_statuspre-flight.
🏝️ IP Bot is in private beta — request access at islandpitch.bot. Requires Node.js >= 18.
Accessibility, for agents
Your agent's output decides whether a blind follower gets a description or silence. This server bakes the accessible path into the tool contract:
altTextis a first-classcreate_content_draftparam whose description instructs agents to always provide it for image posts (describe what the image shows — not the caption); carousels takemediaAltTextsper image. Published as IGalt_text/ FBalt_text_custom— helping posts meet WCAG 1.1.1.- The human review gate flags missing alt text in amber before anything ships — an a11y linter for your feed, enforced by the platform rather than the prompt.
draft_from_ticketcarries a per-cell**Alt:**field so bulk pipelines stay accessible at scale.- Honest limits: Meta has no alt-text API for video/Reels/Stories — the
tool descriptions say so;
.srtvideo captions are next on the roadmap.
It mirrors the @island-pitch/ip-bot-cli
command set as MCP tools over a stdio transport. Full reference below.
Configuration
The server is configured entirely through environment variables:
| Variable | Required | Purpose |
| --- | --- | --- |
| IPBOT_APPSYNC_ENDPOINT | yes | AppSync GraphQL URL |
| IPBOT_API_KEY | yes* | AppSync API key (agent auth) |
| IPBOT_AUTH_TOKEN | no | Cognito ID token / bearer token (use instead of, or alongside, the API key) |
| AWS_REGION | no | AWS region (default us-west-2) |
| ATLASSIAN_SITE / ATLASSIAN_EMAIL / ATLASSIAN_API_TOKEN | no | Optional Jira integration for draft_from_ticket and Jira notifications |
* Provide at least one of IPBOT_API_KEY or IPBOT_AUTH_TOKEN.
Client configuration
Generic MCP client (mcpServers block)
Add this to your client's MCP config (no global install required — npx
downloads and runs the latest published version):
{
"mcpServers": {
"ip-bot": {
"command": "npx",
"args": ["-y", "@island-pitch/ip-bot-mcp"],
"env": {
"IPBOT_APPSYNC_ENDPOINT": "https://api.islandpitch.bot/graphql",
"IPBOT_API_KEY": "ipbot_live_..."
}
}
}
}Claude Code
claude mcp add ip-bot \
--env IPBOT_APPSYNC_ENDPOINT=https://api.islandpitch.bot/graphql \
--env IPBOT_API_KEY=ipbot_live_... \
-- npx -y @island-pitch/ip-bot-mcpOr add it manually to your Claude Code MCP settings using the mcpServers block
above.
Claude Desktop
Add the same mcpServers block to your claude_desktop_config.json.
Tools
The server registers the following MCP tools, grouped by category.
Powers & Winds
list_powers, run_power, get_winds_balance, topup_winds
Powers/Winds are user-scoped: configure
IPBOT_API_KEYwith a per-user key (ipbot_live_…) orIPBOT_AUTH_TOKENwith a Cognito token. Runs debit the key owner's Winds; the shared AppSync key is rejected for these. The catalogue and economy are also exposed as resources (ipbot://powers/catalog,ipbot://winds/economy).
Content / draft pipeline
create_content_draft, submit_for_review, approve_draft, reject_draft,
schedule_publication, reschedule_schedule, publish_now,
cancel_schedule, upload_media, list_drafts, get_draft,
find_draft_by_external_ref, show_calendar, get_schedule,
wait_for_schedule, schedule_debug, draft_from_ticket, list_accounts,
system_status
Organization ("Your Own Crew")
create_organization, invite_member, accept_invite, remove_member,
update_member_role, update_organization, get_org_context,
list_org_drafts, share_account, unshare_account
AutoReply campaigns (Instagram comment/DM automation)
create_campaign, list_campaigns, get_campaign, update_campaign,
set_campaign_status, set_campaign_steps, set_campaign_triggers
triggerMediaIdsrestricts triggering to specific IG media IDs (empty = all media; inbound DMs are never media-filtered). Meta rules the engine enforces: DM steps triggered by a comment send a private reply — max ONE per comment, within 7 days of the comment (violations come back asprivate_reply_already_sent/private_reply_window_expired); free-form DMs require the user to have messaged within 24h. TheHUMAN_AGENTtag is never set — it is reserved for messages typed by real humans.
Tokenized review
create_review_share, list_review_shares, revoke_review_share,
add_review_comment, list_review_comments
Analytics
get_post_insights
Notable conveniences:
schedule_publicationandreschedule_scheduleaccept ISO 8601 or natural language ("in 10 minutes","fri 7pm ET") and return the resolved UTC under_scheduledAt. Reschedule requires an identity-bound caller.create_content_draftaccepts anexternalReffor idempotent creates, analtTextparam (always provide for image posts — publishes as IGalt_text/ FBalt_text_custom; omitting it drops alt text silently), amediaAltTextsarray (per-carousel-child alt text, paired by index withmediaUrls— images only; note Instagram crops all carousel children to the FIRST child's aspect ratio), and first-class Meta differentiator params:locationId(venue tag — always consider for event posts),collaborators(co-author invites for the featured accounts on reels/carousels),userTags,coverUrl/thumbOffset/audioName/shareToFeed(Reels presentation),story(IG Stories),placeId/callToAction/targeting/feedTargeting/backdatedTime(Facebook — usetargeting {"age_min":21}for 21+ compliance content).upload_mediauploads a local image/video to the platform media bucket and returns a publicly fetchable URL (native replacement for external hosts).- Content tickets support a per-cell
**Alt:**line thatdraft_from_ticketcarries into the draft automatically. schedule_debugclassifies publisher errors into stable categories with a suggested fix.
Running locally (development)
npm install
npm run dev # tsx src/index.ts
# or
npm run build && npm startLicense
UNLICENSED — internal Island Pitch tooling.
