Iris
io.github.JCLVSH/irisVersion 0.25.3Run multi-channel outreach: campaigns, contacts, conversations, and AI-drafted messages.
Status
Responds238 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:38 UTC
- Latency
- 238 ms
- Remotes responding
- 1 of 1
- Sign-in
- API key
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 21:12 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://api.iris-ai.dev/mcpResponds238 msNo sign-in
Claude Code
claude mcp add --transport http iris https://api.iris-ai.dev/mcp --header 'Authorization: Bearer <YOUR_TOKEN>'Replace <YOUR_TOKEN> before running.
Claude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: iris
Remote MCP server URL: https://api.iris-ai.dev/mcp
This server expects the header Authorization.Cursor
{
"mcpServers": {
"iris": {
"url": "https://api.iris-ai.dev/mcp",
"headers": {
"Authorization": "Bearer <YOUR_TOKEN>"
}
}
}
}Replace <YOUR_TOKEN> before running.
VS Code
code --add-mcp '{"name":"iris","type":"http","url":"https://api.iris-ai.dev/mcp","headers":{"Authorization":"Bearer <YOUR_TOKEN>"}}'Replace <YOUR_TOKEN> before running.
Streamable HTTP
npm: @jclvsh/iris 0.25.3Package only
npm (npx)
claude mcp add iris -e 'IRIS_API_KEY=<YOUR_IRIS_API_KEY>' -- npx -y @jclvsh/iris@0.25.3Replace <YOUR_IRIS_API_KEY> before running.
Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
81 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
add_campaign_contactsadd contacts to a campaign, by id or by creating them inline. a campaign needs at least one contact before it can be activated. requires write scope. | No | No | Not declared | Not declared |
analyze_campaignqueue AI analysis of a campaign to generate its target profiles: from the product for product_promotion campaigns, from goal_description for any other campaign. runs asynchronously; poll get_campaign until analysis_status is completed, then search_campaign_contacts. requires write scope. | No | No | Not declared | Not declared |
analyze_responseanalyze an inbound message using AI to determine sentiment, intent, and suggested actions. requires generate scope. | No | No | Not declared | Not declared |
approve_messageapprove a pending message for sending. requires send scope. | Yes | No | Not declared | Not declared |
attach_audience_to_campaigncopy a library audience into a campaign. the response is the campaign's own copy (a target profile) - editing it never touches the library master. if the campaign already has a same-named profile, the existing copy is returned. requires write scope. | No | No | Not declared | Not declared |
bulk_import_contactsimport multiple contacts at once, optionally adding them to a campaign. requires write scope. | No | No | Not declared | Not declared |
bulk_message_actionapprove or reject multiple messages at once. requires send scope. | Yes | No | Not declared | Not declared |
check_channel_availabilitycheck which outreach channels are available and configured. requires read scope. | No | Yes | Not declared | Not declared |
configure_autopilotcreate or update the autopilot config (merge: only the fields you send change; first call creates the config with defaults). autopilot is review-only - drafts wait in the approval queue, nothing sends without approval. requires write scope. | No | No | Not declared | Not declared |
configure_respondercreate or update the responder config (merge: only the fields you send change; the first call creates the config). with auto_reply on, replies are sent without review. Instagram only allows a reply within 24 hours of the person's last message, and only to someone who wrote first. requires write scope. | Yes | No | Not declared | Not declared |
create_audiencecreate a library audience profile manually. names are unique per library (case-insensitive). requires write scope. | No | No | Not declared | Not declared |
create_campaigncreate a new outreach campaign. requires write scope. | No | No | Not declared | Not declared |
create_contactcreate a new contact. requires write scope. | No | No | Not declared | Not declared |
create_conversationfind-or-create a conversation for a contact - the hub conversation by default, or the campaign-scoped thread when campaign_id is passed (contact must be in that campaign). requires write scope. | No | No | Not declared | Not declared |
create_conversation_messagecreate a message in a conversation. status pending_approval places it in the human review queue instead of sending. requires write scope. | Yes | No | Not declared | Not declared |
create_responder_comment_triggercreate a comment trigger. when someone comments the keyword on the account's instagram post, iris sends that person one direct message: the owner's message as written, followed by the notice that it is automated. instagram allows one such message per comment, within 7 days of the comment, and nothing more unless the person replies. it only sends while status.comment_triggers on get_responder is ready; needs_permission means the owner has to reconnect instagram from the responder settings page in the iris web app, unavailable means the feature isn't offered on the account yet. each message sent counts as a message against the plan. needs an API key and a connected instagram account; x402 and MPP identities cannot use it. at most 20 triggers per account, and a second trigger with the same keyword on the same post is refused. requires write scope. | Yes | No | Not declared | Not declared |
create_target_profilecreate a target profile for a campaign. requires write scope. | No | No | Not declared | Not declared |
delete_audiencedelete a library audience profile. campaigns it was attached to keep their copy. requires write scope. | Yes | No | Not declared | Not declared |
delete_campaignsoft-delete a campaign (sets status to deleted). requires write scope. | Yes | No | Not declared | Not declared |
delete_campaign_chatsoft-delete a chat session. requires write scope. | Yes | No | Not declared | Not declared |
delete_contactsoft-delete a contact. requires write scope. | Yes | No | Not declared | Not declared |
delete_notificationdelete a notification. requires write scope. | Yes | No | Not declared | Not declared |
delete_responder_comment_triggerdelete a comment trigger. requires write scope. | Yes | No | Not declared | Not declared |
delete_target_profiledelete a target profile from a campaign. requires write scope. | Yes | No | Not declared | Not declared |
generate_audiencesAI-generate audience profiles from a product (scrape + analysis) into the library. generated names already in the library are skipped, not overwritten. rate limited to 5 per hour. requires generate scope. | No | No | Not declared | Not declared |
generate_campaign_contentgenerate campaign-level outreach content (email sequence, templates) from a campaign brief. content-first: takes the strategy inline, not a campaign id. requires generate scope. | No | No | Not declared | Not declared |
generate_contentgenerate AI outreach content (email or DM draft) for a contact/campaign. the contact's tags + enrichment_data feed the generation context automatically. requires generate scope. | No | No | Not declared | Not declared |
get_ai_usageget AI generation usage limits and current counts for the billing period. requires read scope. | No | Yes | Not declared | Not declared |
get_analytics_overviewget a high-level overview of all campaign analytics. requires read scope. | No | Yes | Not declared | Not declared |
get_autopilot_statusget autopilot status: whether it's configured, the current config, the pending-review count for the standing campaign, and the latest run's step results. requires read scope. | No | Yes | Not declared | Not declared |
get_billing_plansget all available billing plans with pricing and feature limits. requires read scope. | No | Yes | Not declared | Not declared |
get_campaignget a campaign by ID with stats. requires read scope. | No | Yes | Not declared | Not declared |
get_campaign_analyticsget detailed analytics for a specific campaign. requires read scope. | No | Yes | Not declared | Not declared |
get_campaign_chat_messageslist the messages in a chat session, oldest first. `content` is an array of opaque blocks (text / tool_use / tool_result). requires read scope. | No | Yes | Not declared | Not declared |
get_campaign_usageget usage limits and current counts for a campaign. requires read scope. | No | Yes | Not declared | Not declared |
get_changelogmachine-readable release history (public) - version, date, type, summary, migration notes on breaking entries. the X-Notice header's structured backstory. | No | Yes | Not declared | Not declared |
get_contactget a contact by ID. requires read scope. | No | Yes | Not declared | Not declared |
get_contact_handlesthe contact's social handles (instagram/twitter/tiktok) - verify a handle write landed. requires read scope. | No | Yes | Not declared | Not declared |
get_contact_typesget breakdown of contacts by type/source. requires read scope. | No | Yes | Not declared | Not declared |
get_contact_usageget contact usage limits and current counts for the billing period. requires read scope. | No | Yes | Not declared | Not declared |
get_conversationget a conversation by ID with contact and campaign details. requires read scope. | No | Yes | Not declared | Not declared |
get_conversation_messagesget all messages in a conversation. requires read scope. | No | Yes | Not declared | Not declared |
get_conversation_responderget the responder's status for a single conversation: active, paused, handed off, or never seen, plus the reason and reply counts. requires read scope. | No | Yes | Not declared | Not declared |
get_discovery_jobget the status, progress, and contacts of a discovery job. status values: pending, running, completed, failed. contacts populated only when status=completed. requires read scope. | No | Yes | Not declared | Not declared |
get_engagement_metricsget overall engagement metrics across all conversations. requires read scope. | No | Yes | Not declared | Not declared |
get_performance_metricsget email performance metrics over time. requires read scope. | No | Yes | Not declared | Not declared |
get_responderget responder status: whether it's configured, the current config, connection and pause status, and activity counts for the last 30 days. requires read scope. | No | Yes | Not declared | Not declared |
get_response_timeget average response time analytics. requires read scope. | No | Yes | Not declared | Not declared |
get_usageget your current plan, quota usage (campaigns used/remaining this period), and billing period (requires read scope) | No | Yes | Not declared | Not declared |
list_audienceslist the audience library - reusable target profiles created once and attachable to any campaign. requires read scope. | No | Yes | Not declared | Not declared |
list_campaign_chatslist your iris chat sessions (the conversational campaign builder), most recently updated first, max 100. the live chat turn itself is a server-sent-events stream outside this tool set. requires read scope. | No | Yes | Not declared | Not declared |
list_campaign_contactslist contacts in a campaign with optional status filter. requires read scope. | No | Yes | Not declared | Not declared |
list_campaignslist all campaigns with optional filtering by status. requires read scope. | No | Yes | Not declared | Not declared |
list_connected_accountslist all connected social media accounts. requires read scope. | No | Yes | Not declared | Not declared |
list_contact_conversationslist all conversations for a specific contact. requires read scope. | No | Yes | Not declared | Not declared |
list_contactslist all contacts with optional search. requires read scope. | No | Yes | Not declared | Not declared |
list_conversationslist conversations with optional filtering. requires read scope. | No | Yes | Not declared | Not declared |
list_discovery_sourceslist available discovery data sources and their status. requires read scope. | No | Yes | Not declared | Not declared |
list_notificationslist user notifications. requires read scope. | No | Yes | Not declared | Not declared |
list_pending_messageslist messages awaiting approval before sending. requires read scope. | No | Yes | Not declared | Not declared |
list_responder_activitylist the responder's activity log (replies sent, handoffs, skips, and failures), newest first. requires read scope. | No | Yes | Not declared | Not declared |
list_responder_comment_triggerslist the account's comment triggers. a comment trigger watches for a keyword in instagram comments and sends the commenter one automatic DM. requires read scope. | No | Yes | Not declared | Not declared |
list_responder_postslist the account's recent instagram posts with their media ids, for limiting a comment trigger to one post. requires read scope. | No | Yes | Not declared | Not declared |
list_target_profileslist target profiles for a campaign. requires read scope. | No | Yes | Not declared | Not declared |
mark_all_notifications_readmark all notifications as read. requires write scope. | No | No | Not declared | Not declared |
mark_conversation_readmark a conversation as read. requires write scope. | No | No | Not declared | Not declared |
mark_message_sentmark a pending manual-channel draft (tiktok, or instagram cold first-touch) as sent outside the platform. API-sendable drafts must use approve_message instead. requires write scope. | No | No | Not declared | Not declared |
reject_messagereject a pending message with an optional reason. requires send scope. | Yes | No | Not declared | Not declared |
rename_campaign_chatrename a chat session. requires write scope. | No | No | Not declared | Not declared |
retry_messageretry sending a failed message. requires send scope. | Yes | No | Not declared | Not declared |
run_autopilot_nowqueue a manual autopilot run immediately (insights refresh + discovery top-up on the standing campaign). steps that already completed today are skipped. rate limited to 2 per hour. requires generate scope. | No | No | Not declared | Not declared |
search_campaign_contactssearch for contacts matching a campaign's target profiles. requires generate scope. | No | No | Not declared | Not declared |
search_contactskick off a multi-source contact discovery job (Apify-backed). returns a job_id and contacts when ready (waits up to 90s; if status=queued, poll get_discovery_job). closed source list: google_maps, instagram, twitter, tiktok, reddit. requires generate scope. | No | No | Not declared | Not declared |
send_channel_messagesend a message through a specific channel in a conversation. requires send scope. | Yes | No | Not declared | Not declared |
set_conversation_responderpause or resume the responder for a single conversation. pausing works on any conversation; resuming is refused after the person asked iris to stop. requires write scope. | Yes | No | Not declared | Not declared |
submit_message_feedbacksubmit feedback on an AI-generated message to improve future generations. requires send scope. | No | No | Not declared | Not declared |
update_campaignupdate a campaign's details. requires write scope. | No | No | Not declared | Not declared |
update_contactupdate a contact's details. requires write scope. | No | No | Not declared | Not declared |
update_conversationupdate a conversation's status: active, archived, or closed. requires write scope. | No | No | Not declared | Not declared |
update_notificationupdate a notification (e.g., mark as read). requires write scope. | No | No | Not declared | Not declared |
update_responder_comment_triggerupdate a comment trigger's keyword, message, media_id, or enabled state. give at least one field besides id. someone else's trigger, or an id that isn't a comment trigger on this account, is a 404. requires write scope. | Yes | No | Not declared | Not declared |
Details
- Registry status
- Active
- Published
- Nov 13, 2026
- Updated
- Nov 13, 2026
- Repository
- Not given
- Categories (suggested)
- CommunicationMarketing and SEOSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared