DevelopersMCP server

Title MCP Server

Connect Claude or any other MCP client to your Title account. Build flows, manage contacts, send RCS messages and read analytics over the Model Context Protocol.

Streamable HTTPOAuth 2.1 + PKCE139 tools
Overview

One endpoint for your whole messaging stack

Any MCP-compatible client or agent can work with your Title brand in natural language. Here is the shape of the server.

Endpoint
https://titlebm.com/api/mcp
Transport
Streamable HTTP (MCP), JSON responses
Auth
OAuth 2.1 with PKCE, or an Agent Connect key
Session scope
One brand, fixed at connect time
Tools
139 built-in + connected-integration tools
Resources
4 (contacts, flows, campaigns, skills)
Prompts
11 (3 tasks, 8 skills)

Prefer plain HTTP? The same brand is reachable through the REST API. To plug your own AI agent into a text line, see Agent Connect.

Connect

Add the server to your client

Pick whichever your client supports: paste the remote URL, or drop a config block into your config file. Then sign in once.

Option A: Remote URL (clients with built-in remote MCP connectors, such as Claude)
https://titlebm.com/api/mcp
Option B: Claude Code
terminal
claude mcp add --transport http title https://titlebm.com/api/mcp
Option C: Config file (clients that take an HTTP server entry)
mcp client config
{
  "mcpServers": {
    "title": {
      "type": "http",
      "url": "https://titlebm.com/api/mcp"
    }
  }
}
Option D: stdio bridge (clients that only speak stdio, via mcp-remote)
mcp client config
{
  "mcpServers": {
    "title": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://titlebm.com/api/mcp"]
    }
  }
}
On first use your client opens a Title sign-in (OAuth 2.1 with PKCE). The brand you pick becomes the default account; the connection can act in every org and brand you can open, chosen per call with list_accounts and brand_id.
Tools

139 built-in tools

Tools marked write need the write scope (or admin). The second pill is the tool's permission group: the person who connected the AI (or their admin) can switch a whole group off in Settings → AI connections, and the tool then answers FORBIDDEN naming the switch. Each connected integration adds its own tools to the same session, for example a HubSpot connection exposes hubspot.* tools alongside these.

View (always on)Build and editSend messages and launchContactsTurn things on and offSettings and RCS setupDelete accountsBilling and cardsTeam membersStruck-through groups have no tools: deleting accounts, billing and cards, and team members are never available to an AI.
Contacts and lists· 24
query_contacts()readViewSearch and filter contacts by tag, list, consent and more.
get_contact()readViewFull details for one contact, by id or phone number.
create_contact()writeContactsCreate a contact, or update it when the phone number already exists.
update_contact()writeContactsChange tags, fields and list memberships, or add a note.
bulk_import_contacts()writeContactsImport up to 1,000 contacts at once, optionally into a list.
get_tags()readViewEvery contact tag in use, with counts.
get_sublists()readViewEvery contact list, with counts.
create_sublist()writeContactsCreate a new contact list.
delete_contact()writeContactsPermanently delete one contact with their conversation, notes and list memberships.
bulk_update_contacts()writeContactsOne change for many contacts: tags, lists, consent or delete, by ids or an audience; dry_run available.
export_contacts()readViewA CSV of contacts with tags, consent and contact values, optionally for an audience.
create_tag()writeContactsCreate a tag for the org.
rename_tag()writeContactsRename a tag everywhere, including on every contact.
delete_tag()writeContactsRemove a tag from the org and from every contact.
update_list()writeContactsRename a list or change its description or color.
delete_list()writeContactsDelete a list; the contacts stay.
add_contacts_to_list()writeContactsAdd contacts (ids or an audience) to a list.
remove_contacts_from_list()writeContactsRemove contacts (ids or an audience) from a list.
list_contact_fields()readViewThe contact value definitions (custom fields) of a sub-account.
create_contact_field()writeContactsDefine a contact value such as {dog_name}, with type, options and fallback text.
update_contact_field()writeContactsChange a contact value definition (the key stays).
delete_contact_field()writeContactsRemove a contact value definition, optionally clearing stored values.
add_contact_note()writeContactsAdd an internal note to a contact.
list_contact_notes()readViewThe internal notes on a contact.
Messaging and conversations· 9
send_message()writeSend messages and launchSend a text, rich card, carousel or media message to a phone number.
validate_message()readViewDry-run a message: returns the errors send_message would, without sending.
check_rcs_capability()readViewCheck whether phone numbers can receive RCS.
get_message_status()readViewDelivery, read and tap status for messages sent to a contact.
get_conversation_history()readViewMessage history with a contact.
upload_media()writeBuild and editUpload an image or video from a URL to the media library.
get_media_library()readViewUploaded images, videos and GIFs with public URLs.
assign_conversation()writeContactsAssign a conversation to a team member.
escalate_to_human()writeContactsFlag a contact for human follow-up with a reason and priority.
Message flows· 19
get_flow_authoring_guide()readViewHow to write a flow: the FlowIntent format, limits, variables and its JSON Schema.
validate_flow()readViewCompile a FlowIntent without saving. Returns errors, warnings and a summary.
create_flow()writeBuild and editSave a FlowIntent as a new inactive draft flow. Sends nothing.
get_flow_intent()readViewThe editable FlowIntent of a saved flow, for update_flow.
update_flow()writeBuild and editReplace a saved flow with a corrected FlowIntent, in place.
get_flow()readViewList saved flows, or the details of one flow.
trigger_flow()writeSend messages and launchSend a saved flow to one contact.
get_templates()readViewSaved flow templates with usage counts.
get_flow_examples()readViewReference flows to copy the structure of when building a new one.
set_flow_active()writeTurn things on and offTurn a flow on (publish) or off; refuses when another active flow owns the same keyword.
set_flow_trigger()writeBuild and editSet what starts a flow: keyword, tag, schedule, webhook, app event or manual.
duplicate_flow()writeBuild and editCopy a flow as a new draft in the same sub-account.
delete_flow()writeBuild and editMove a flow to the trash (recoverable).
restore_flow()writeBuild and editBring a trashed flow back.
list_trashed_flows()readViewFlows in the trash.
test_send_flow()writeSend messages and launchSend a flow to the connected person's own verified number through the real engine.
list_flow_runs()readViewThe run log of one flow: contacts, status, steps, messages, errors.
get_flow_message_report()readViewSent, delivered, read, tapped and replied per card and per button of one flow.
get_flow_campaigns()readViewWhich campaigns track each flow.
Sends and the Calendar· 7
check_send()readViewPre-launch dry run: audience counts, opt-outs, cost and credits, quiet hours, blank values, the RCS agent and blockers.
send_flow()writeSend messages and launchSend or schedule a flow to an audience through the real send path, after the pre-launch check; dry_run available.
list_scheduled_sends()readViewUpcoming, paused or past sends with flow, audience size and status.
pause_scheduled_send()writeSend messages and launchHold a send that has not started.
resume_scheduled_send()writeSend messages and launchResume a paused send.
reschedule_send()writeSend messages and launchMove a scheduled or paused send to a new time.
cancel_scheduled_send()writeSend messages and launchCancel a scheduled, paused or in-progress send.
Campaigns and automations· 30
create_campaign()writeSend messages and launchLegacy scheduled send: send a flow to an audience now or later (Calendar).
list_campaigns()readViewLegacy scheduled sends with status and audience details.
list_tracked_campaigns()readViewCampaigns (trackers) of a sub-account: status, attached flows, people, conversions, revenue.
get_campaign()readViewOne campaign: stages, attached flows with their cards and buttons, rules, dashboard widgets.
get_campaign_report()readViewThe campaign report: people per stage, conversions and revenue, per-flow and per-card sent / delivered / read / tapped / replied, trend by day.
create_tracked_campaign()writeBuild and editCreate a campaign (a tracker; it never sends) with its stages and the standard dashboard.
update_campaign()writeBuild and editChange a campaign's name, goal, main conversion rule or end date.
set_campaign_status()writeTurn things on and offSet a campaign to draft, live, ended or archived. Rules only run while live.
attach_to_campaign()writeBuild and editTrack an existing flow or automation in a campaign.
detach_from_campaign()writeBuild and editStop tracking a flow or automation (its rules are removed).
create_campaign_flow()writeBuild and editCreate a flow inside a campaign (a normal flow, marked with the campaign).
set_campaign_stages()writeBuild and editReplace the ordered pipeline stages of a campaign.
add_campaign_rule()writeBuild and editAdd a when / do rule: an event on a card, button or reply, a tag or a webhook → move to a stage, count a conversion, start an automation.
update_campaign_rule()writeBuild and editChange or turn a rule on or off.
delete_campaign_rule()writeBuild and editRemove a rule.
add_dashboard_widget()writeBuild and editAdd a dashboard widget from a declarative spec (metric, visualization, options, size).
update_dashboard_widget()writeBuild and editChange a widget's spec, size or position.
arrange_dashboard_widgets()writeBuild and editReorder the dashboard.
delete_dashboard_widget()writeBuild and editRemove a widget from the dashboard.
list_automations()readViewAutomations of a sub-account with trigger, on/off, last run, runs and errors.
get_automation()readViewOne automation: its trigger, steps, validation problems and overlaps.
create_automation()writeBuild and editCreate an automation from a trigger and ordered steps; saved off unless activate is true.
update_automation()writeBuild and editChange an automation's name, description or steps.
set_automation_enabled()writeTurn things on and offTurn an automation on or off.
get_automation_activity()readViewRecent runs of an automation with steps, outcome, errors and the flows it started.
dry_run_automation()readViewWhat would happen if an automation ran for one contact: the branch taken, the steps, the flows that would start. Changes nothing.
test_run_automation()writeSend messages and launchReally run an automation once for one contact tagged test-contact; the flows it starts send real messages to that contact.
list_campaign_people()readViewThe contacts enrolled in a campaign with stage, status, conversions and revenue.
get_campaign_dashboard()readViewThe campaign's dashboard widgets with their computed data.
duplicate_campaign()writeBuild and editCopy a campaign (stages, rules, dashboard) as a new draft.
Org Creations and pushes· 15
list_org_items()readViewThe organization's own flows, campaigns and automations (never run by themselves; pushed to sub-accounts).
get_org_item()readViewOne org item with its versions and where it was pushed.
create_org_item()writeBuild and editCreate an org flow (from a FlowIntent), campaign or automation; {brand.key} values fill in per sub-account at send time.
update_org_item()writeBuild and editChange an org item's name, description, flow, steps or goal.
push_to_subaccounts()writeBuild and editCopy an org item (and what it references) into sub-accounts as linked, read-only copies; dry_run returns the pre-push check.
list_pushes()readViewThe push history: item, version, sub-account, when, by whom, warnings.
get_push()readViewOne push record with the version snapshot it carried.
delete_creation()writeBuild and editDelete an org-level flow, campaign or automation.
unlink_pushed_copy()writeBuild and edit"Make a copy": unlink a pushed copy in a sub-account so it can be edited there.
list_sub_accounts()readViewAn org's sub-accounts with time zone, RCS agent and credit balance.
get_org_report()readViewEvery sub-account of an org with contacts, sent, delivered, read, replied and opt-outs over N days.
push_update()writeBuild and editPush a new version of an org item to the sub-accounts that hold it; dry_run previews what changes per sub-account.
get_org_campaign_results()readViewCombined results of a pushed campaign across sub-accounts, ranked, or the org overview.
launch_in_subaccounts()writeSend messages and launchLaunch a pushed flow in all or some sub-accounts at once; dry_run returns the confirm-screen numbers.
hq_push()writeBuild and editTitle staff only: push a linked copy of any item to any org or sub-account, with the pre-push check.
Values· 8
get_brand_values()readViewThe {brand.key} values of a sub-account, built-ins included.
set_brand_values()writeSettings and RCS setupFill in {brand.key} values for a sub-account.
list_value_definitions()readViewBrand value definitions (org-wide and brand-only).
create_value_definition()writeSettings and RCS setupDefine a {brand.key} value for one sub-account or the whole org.
update_value_definition()writeSettings and RCS setupChange a brand value definition (the key stays).
delete_value_definition()writeSettings and RCS setupRemove a brand value definition and its values.
get_org_values()readViewOrg-wide {key} values.
set_org_values()writeSettings and RCS setupSet or remove org-wide {key} values.
RCS agent, verification and settings· 9
get_rcs_setup()readViewThe connected agent, the verification steps and who does each, switchable agents, keyword replies and SMS fallback.
connect_rcs_agent()writeSettings and RCS setupConnect a verified agent, Twilio, a previous connection, or Title's agent (staff only).
disconnect_rcs_agent()writeSettings and RCS setupDisconnect the RCS agent; nothing sends until one is connected again.
save_verification_business_info()writeSettings and RCS setupGet verified, step 1: the business information.
save_verification_agent_profile()writeSettings and RCS setupGet verified: the agent profile (name, description, images, contacts, use case), after payment.
create_verification_test_agent()writeSettings and RCS setupGet verified: create the test agent once Title has registered the business.
get_keyword_replies()readViewThe STOP / START / HELP keywords and replies.
set_keyword_replies()writeSettings and RCS setupEdit the STOP / START / HELP keywords and replies (STOP always stays).
update_brand_settings()writeSettings and RCS setupA sub-account's name, website, time zone, contact details and quiet-hours mode.
Analytics and events· 9
get_analytics()readViewTop-level performance metrics for the brand.
get_contact_analytics()readViewOne contact: messages, taps, replies, tags and recent activity.
get_message_stats()readViewSent, delivered, read, tap and reply counts for a flow, campaign or date range.
get_campaign_stats()readViewPerformance of one campaign.
get_flow_analytics()readViewEnrollment, completion and per-step performance of one flow.
get_contact_stats()readViewContact totals: opt-ins, opt-outs, tags, lists, recent campaigns.
get_recent_sends()readViewRecent sends with delivery, taps, replies and cost. Defaults to 14 days.
get_message_events()readViewEvery RCS event (sent, delivered, read, reply, tap, failed, opt-out) by campaign, flow, contact, type or time.
get_event_counts()readViewEvent counts and delivery, read and read-to-reply rates by campaign, flow or day.
Skills (the Title skill pack)· 2
list_skills()readViewThe skill pack: short guides for flows, sends, campaigns, automations, values, orgs, RCS setup, reporting and troubleshooting.
get_skill()readViewThe full markdown of one skill, with its reference files.
Account and integrations· 7
list_accounts()readViewEvery org and sub-account you can act in, your role in each, the default account and this connection's limits.
set_default_account()readViewChoose the sub-account tools use when no brand_id or org_id is passed.
get_credit_balance()readViewCurrent credit balance and low-balance threshold.
get_brand_status()readViewOne snapshot: brand identity, RCS agent and verification, credits, integrations.
get_integrations()readViewThird-party integrations and whether each is connected.
lookup_services()readViewSearch the services and products catalogue.
check_availability()readViewOpen booking slots for a service from the connected calendar or booking system.

Tool results are JSON. A failed call returns an error result with a code such as INVALID_PARAMS, NOT_FOUND, UNAUTHORIZED or RATE_LIMITED. send_message, trigger_flow and create_campaign send real messages to real people; the server asks the model to confirm with you first.

Resources

Browsable data

Read-only MCP resources let an agent page through data without a tool call. The URI templates accept query parameters.

title://contacts{?limit,offset}Contacts with name, phone, tags and consent. limit up to 100 (default 50), offset for paging.
title://flows{?limit,active_only}Saved message flows with id, name and status. active_only=true hides drafts.
title://campaigns{?limit,status}Campaigns with id, name, status and dates. status filters (default all).
title://skills/{slug}The Title skill pack as markdown, one resource per skill (same text as get_skill). No account needed.
Prompts

11 prompts

Task prompts steer the model toward the right sequence of tools. Skill prompts are reference material the client loads when it needs it, so the full guide is never in context by default.

Tasks· 3
send-booking-confirmationSend a booking confirmation rich card to a phone number (service, date, time).
run-reengagementFind contacts inactive for N days and propose a re-engagement campaign.
build-demo-flowWrite, validate and save a demo flow for a type of business.
Skills· 8
skill.flow_authoringStart here: the FlowIntent format, a worked example, limits and the validate then create workflow.
skill.rcs_specRCS message types, button types, suggestion chips, character limits and best practices.
skill.variablesEvery personalization placeholder: contact, brand, date, integration and flow-context variables.
skill.conventionsTitle flow conventions: naming, structure, buttons versus chips, opt-out rules, brand voice.
skill.accounts_and_limitsWhich accounts you can act in, how to choose one, the daily spending limit, permission switches and what AIs may never do.
skill.flow_patternsNamed recipes: appointment confirmation, welcome series, win-back, seasonal promo, preference routing.
skill.automationsAutomations: launch triggers, glue steps, the start-a-flow rule, the step spec, test mode and the activity log.
skill.campaignsCampaigns as trackers: attach flows, stages, when / do rules on cards and buttons, conversions and revenue, the dashboard widget spec, and reporting by campaign.
Skill pack

10 skills that teach any AI how to use Title

Short, generic guides written for an AI: when to use the skill, a quick reference of the tools and the permission group each needs, step-by-step recipes and common mistakes. Never specific to one kind of business.

Download the skill pack (zip)title-skills/2026-10-07

Through MCP, nothing to install: a connected AI calls list_skills and get_skill, or reads title://skills/<slug> as a resource. Claude Code: unzip and copy the folders into .claude/skills/. Claude.ai: Settings → Capabilities → Skills → upload one folder at a time (/api/skills/download?skill=<slug> downloads a single skill). Any other AI: the files are plain markdown; paste the one you need into its instructions.

getting-startedGetting started with Title. Connect an AI to Title, understand permissions, find sub-accounts and orgs, and learn the model: flows send, automations start flows, campaigns track. zip
build-a-flowBuild a flow. Write, validate and save a message flow: cards, buttons, quick replies, triggers, publish, duplicate and test send. zip
send-a-flowSend a flow. Send or schedule a flow to an audience safely: check_send first, then send_flow; pause, reschedule, cancel; what it costs. zip
campaigns-and-dashboardsCampaigns and dashboards. Campaigns are trackers that never send: attach flows, stages, when / do rules, conversions with revenue, dashboard widgets and reports. zip
automationsAutomations. When something happens, do something: launch triggers, start a flow, glue steps, dry runs, test runs and turning on. zip
values-and-personalizationValues and personalization. Contact, brand and org values, {key|fallback}, flow variables, and how to define and fill them. zip
orgs-and-pushOrgs and push. Build at the org level, push to sub-accounts, update pushes and rollouts, Make a copy, results and launches across sub-accounts. zip
rcs-setup-and-verificationRCS setup and verification. The RCS agent, its status, the Get verified steps and who does each, keyword replies and sub-account settings. zip
reportingReporting. Read results per flow, card, button, campaign, sub-account and org, and the events behind every message. zip
troubleshootingTroubleshooting. Why a message did not send or a trigger did not fire: safety checks, quiet hours, opt-outs, credits, triggers and the live list. zip
Authentication

OAuth 2.1, one connection per person

The server is a standard OAuth 2.1 protected resource. An unauthenticated request gets a 401 with discovery metadata; the client registers itself and sends you to sign in. No keys to manage.

discovery handshake
$ curl -i -X POST https://titlebm.com/api/mcp \
    -H "Content-Type: application/json" \
    -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}'

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata=
  "https://titlebm.com/.well-known/oauth-protected-resource"
Authorization code with PKCE (S256)
The only grant for new sessions, plus refresh_token to renew. Access tokens last 60 minutes and refresh tokens rotate on every use, so a connection lasts as long as it is used at least once every 90 days. The client never sees your Title password.
Scopes: read, write, admin
A client that asks for no scope gets read. Tools marked write above need write or admin. Every call is checked against your current access; brand_id or org_id picks the account, and you can switch off groups of tools per connection in Personal settings.
Dynamic client registration
Clients fetch the protected-resource metadata, find the authorization server, and register automatically. Public clients only (no client secret).
Resource metadata
https://titlebm.com/.well-known/oauth-protected-resource
Server metadata
https://titlebm.com/.well-known/oauth-authorization-server
Register
https://titlebm.com/api/mcp/oauth/register
Authorize
https://titlebm.com/api/mcp/oauth/authorize
Token
https://titlebm.com/api/mcp/oauth/token
Agent mode

Same endpoint, Agent Connect key

Agent Connect lets a business plug its own AI agent into its text line. Send that connection's API key as the bearer token instead of signing in, and the server exposes only the six agent tools, scoped to that one connection.

list the agent tools
$ curl https://titlebm.com/api/mcp \
    -H "Authorization: Bearer titlek_live_..." \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
agent_me()The Agent Connect connection this key belongs to.
agent_get_updates()New events (messages, receipts, opt-outs, hand-offs) after a cursor. Waits up to 20 seconds.
agent_reply()Send a message in one of the agent's conversations, or start one by phone number.
agent_send_typing()Show a typing indicator in a conversation.
agent_handoff()Hand a conversation to the business's team.
agent_get_conversation()Recent messages in one of the agent's conversations.

OAuth sessions never see these tools, and an agent key never sees the tools above. The rules and error codes match the REST endpoints. Setup, events and guardrails are in the Agent Connect guide.

Rate limits

Per-organization limits

Going over a tool limit returns an error result with code RATE_LIMITED so your agent can back off. The HTTP limit answers 429 with a Retry-After header.

LIMIT
DEFAULT
APPLIES TO
Tool calls
60 / min
Every tool call, per connected person
Message sends
1,000 / min
send_message, create_campaign, send_flow, test_send_flow, per connected person
HTTP requests
100 / 15 min
POST requests to the endpoint, per client IP
Ready to connect your agent?
Paste the endpoint, sign in, and start messaging.
https://titlebm.com/api/mcp