npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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

Readme

@island-pitch/ip-bot-mcp

npm version node >= 18

#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-mcp

Then 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_draftsubmit_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_draft treats altText as 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, collaborators co-author invites for the featured accounts, userTags, Reels presentation, IG Stories, Facebook CTA buttons, 21+ targeting for compliance content, backdatedTime.
  • Agent-grade ergonomics. Idempotent creates (externalRef), natural-language scheduling, typed {error: {code, message}} failures, upload_media for native image hosting, schedule_debug that reads the publisher's logs and suggests the fix, and system_status pre-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:

  • altText is a first-class create_content_draft param whose description instructs agents to always provide it for image posts (describe what the image shows — not the caption); carousels take mediaAltTexts per image. Published as IG alt_text / FB alt_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_ticket carries 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; .srt video 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-mcp

Or 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_KEY with a per-user key (ipbot_live_…) or IPBOT_AUTH_TOKEN with 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

triggerMediaIds restricts 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 as private_reply_already_sent / private_reply_window_expired); free-form DMs require the user to have messaged within 24h. The HUMAN_AGENT tag 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_publication and reschedule_schedule accept 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_draft accepts an externalRef for idempotent creates, an altText param (always provide for image posts — publishes as IG alt_text / FB alt_text_custom; omitting it drops alt text silently), a mediaAltTexts array (per-carousel-child alt text, paired by index with mediaUrls — 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 — use targeting {"age_min":21} for 21+ compliance content).
  • upload_media uploads 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 that draft_from_ticket carries into the draft automatically.
  • schedule_debug classifies 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 start

License

UNLICENSED — internal Island Pitch tooling.