Blip
БесплатноНе проверенMCP server for the Take Blip platform that exposes contacts, buckets, broadcast lists, and more to any MCP client, with read-only safety by default and optional
Описание
MCP server for the Take Blip platform that exposes contacts, buckets, broadcast lists, and more to any MCP client, with read-only safety by default and optional write capabilities.
README
An MCP server for the Take Blip platform. It exposes your Blip account to any MCP client (Claude Code, Claude Desktop, Cursor, …) over the stdio transport, on top of the official Blip HTTP / Command API.
You can:
- Reach your Blip resources — contacts (CRM), key/value buckets, broadcast lists, schedules, and a generic escape hatch for anything else.
- Ask your bot's AI / knowledge base a question (
blip_ask_ai). - Send messages and mutate data — gated behind an explicit safety switch so you don't message real users by accident.
Built with
@modelcontextprotocol/sdk, TypeScript (strict),zodvalidation, per-request timeouts, retry-with-backoff, and secret redaction everywhere.
Requirements
- Node.js 18.17+ (uses the built-in global
fetch). - A Take Blip bot and its connection credentials (see below).
Install
Three ways for people to run it:
Straight from GitHub (no npm needed — works as soon as the repo is pushed):
npx -y github:Michaeltsg/mcp-blip --versionnpm clones, builds (via the
preparescript) and runs it. This is what the.mcp.jsonbelow uses.From npm (recommended — published):
npx -y take-blip-mcp. Note: the nameblip-mcpis already taken on npm, so publish under a free name (this package is set up astake-blip-mcp) and usenpx -y take-blip-mcp.Clone & build (for development or a pinned local copy):
git clone https://github.com/Michaeltsg/mcp-blip.git cd mcp-blip && npm install && npm run build # then point .mcp.json at: node /abs/path/to/mcp-blip/dist/index.js
⚠️ Do not use a bare
npx blip-mcp— that pulls a different, unrelated package from npm. Always use thegithub:Michaeltsg/mcp-blipform (or your own published name).
Get your Blip credentials (portal step-by-step)
Open your bot in the Blip portal (https://blip.ai → your bot).
Go to Configurações (Settings) → Informações de conexão (Connection information).
Open the HTTP Endpoints section.
Copy the value of "Cabeçalho de autenticação (Authorization)" (Authorization header). It already looks like:
Key bWV1Ym90OmFiYzEyMy4uLg==That whole string is your
BLIP_AUTHORIZATION.Your contract id / shortname is the bot subdomain — it forms the host
https://<contract>.http.msging.net. Use it asBLIP_CONTRACT_ID.
Prefer not to copy the ready-made header? You can instead provide
BLIP_BOT_IDENTIFIER+BLIP_ACCESS_KEYand the server computesKey base64("<identifier>:<accessKey>")for you.
Multiple bots (multi-flow)
If your account has several bots (a router + sub-bots), add each as a flow. For EACH bot, repeat the credential steps above to get its name (the bot Id) and an access key:
BLIP_CONTRACT_ID=mycontract
BLIP_FLOW_NAME=my-router-bot
BLIP_AUTHORIZATION="Key ..." # default flow
BLIP_FLOW_1_NAME=my-subbot
BLIP_FLOW_1_AUTHORIZATION="Key ..."
BLIP_FLOW_2_NAME=another-bot
BLIP_FLOW_2_AUTHORIZATION="Key ..."
blip_list_flows shows everything configured (names only). When you map a flow,
the server checks that each key's real identity matches its configured name.
Environment variables
| Variable | Required | Default | Description |
|---|---|---|---|
BLIP_AUTHORIZATION |
one of two modes | — | Ready-made header, e.g. Key <base64>. Preferred. |
BLIP_BOT_IDENTIFIER |
with access key | — | Bot identifier (credential mode 2). |
BLIP_ACCESS_KEY |
with identifier | — | Access key (credential mode 2). |
BLIP_CONTRACT_ID |
no | — | Contract / shortname → host https://<id>.http.msging.net. |
BLIP_SHORTNAME |
no | — | Alias for BLIP_CONTRACT_ID. |
BLIP_BASE_URL |
no | derived | Full base URL override (rare). |
BLIP_ALLOW_WRITES |
no | false |
Master switch for side-effecting tools. |
BLIP_REQUEST_TIMEOUT_MS |
no | 30000 |
Per-request timeout (ms). |
BLIP_MAX_RETRIES |
no | 3 |
Retries on 429/5xx/network errors. |
BLIP_LOG_LEVEL |
no | info |
error | warn | info | debug (stderr only). |
BLIP_FLOW_NAME |
no | default |
Friendly name for the default flow (e.g. your bot Id). |
BLIP_FLOW_<n>_* |
no | — | Extra flows: _NAME, _AUTHORIZATION (or _BOT_IDENTIFIER/_ACCESS_KEY), _CONTRACT_ID. |
BLIP_FLOWS_DIR |
no | flows |
Where blip_map_flow writes componentized docs. |
BLIP_ENV_FILE |
no | blip.env |
Path to an env file to auto-load (real env always wins). |
BLIP_DATA_DIR |
no | .mcp-blip |
Base folder for everything blip-mcp writes. |
If no contract/host is given, the server falls back to the shared host
https://http.msging.net (for accounts not in an organization).
Safety: read-only by default
Every tool that sends a message or mutates data is gated by
BLIP_ALLOW_WRITES (default false). While off:
blip_send_message,blip_set_bucket,blip_set_contact,blip_delete_contactreturn a "READ-ONLY MODE" notice instead of running.blip_commandrefuses any method other thanget.
Start in read-only mode while you explore. Set BLIP_ALLOW_WRITES=true (and
restart the server) only when you're ready to cause real side effects.
Configure your MCP client
Project file .mcp.json (recommended)
Drop a .mcp.json at your project root (any MCP client picks it up). Keep your
secrets in a gitignored blip.env and point the server at it:
{
"mcpServers": {
"blip": {
"command": "npx",
"args": ["-y", "github:Michaeltsg/mcp-blip"],
"env": { "BLIP_ENV_FILE": "blip.env", "BLIP_ALLOW_WRITES": "false" }
}
}
}
Then create blip.env next to it with your credentials. The server also
auto-loads ./blip.env even if you omit BLIP_ENV_FILE. See
.mcp.json.example. (Cursor uses .cursor/mcp.json, same shape.)
Claude Code
Local build (works today):
claude mcp add blip -s user \
-e BLIP_AUTHORIZATION="Key xxxxx" \
-e BLIP_CONTRACT_ID="meu-contrato" \
-e BLIP_ALLOW_WRITES="false" \
-- node /absolute/path/to/mcp-blip/dist/index.js
After publishing to npm, the same with npx:
claude mcp add blip -s user \
-e BLIP_AUTHORIZATION="Key xxxxx" \
-e BLIP_CONTRACT_ID="meu-contrato" \
-e BLIP_ALLOW_WRITES="false" \
-- npx -y github:Michaeltsg/mcp-blip
Claude Desktop / Cursor (JSON)
Add to mcpServers (Claude Desktop: claude_desktop_config.json):
{
"mcpServers": {
"blip": {
"command": "node",
"args": ["/absolute/path/to/mcp-blip/dist/index.js"],
"env": {
"BLIP_AUTHORIZATION": "Key xxxxx",
"BLIP_CONTRACT_ID": "meu-contrato",
"BLIP_ALLOW_WRITES": "false"
}
}
}
}
Once published, swap command/args for "command": "npx", "args": ["-y", "github:Michaeltsg/mcp-blip"].
Validate credentials (self-test)
BLIP_AUTHORIZATION="Key xxxxx" BLIP_CONTRACT_ID="meu-contrato" \
node dist/index.js --self-test
It performs a tiny GET /contacts?$take=1 and prints a masked config
summary plus OK/FAILED. Your token is never printed.
Tools
Read (safe, always available)
| Tool | What it does |
|---|---|
blip_list_contacts |
List CRM contacts. Args: skip, take (1–100), filter (OData). |
blip_get_contact |
Get one contact by identity. |
blip_find_contact_by_phone |
Find a contact by phone (tries 55/+/local formats). |
blip_get_bucket |
Read a value from key/value storage by id. |
blip_list_broadcast_lists |
List broadcast/distribution lists. (experimental) |
blip_list_recipients |
List recipients of a broadcast list. (experimental) |
blip_list_schedules |
List scheduled messages/commands. (experimental) |
blip_ask_ai |
Ask your bot's AI. mode="knowledge" (knowledge base) or "intent" (intentions/entities). (experimental) |
blip_command |
Escape hatch: run any get command (and writes when enabled). |
blip_get_thread |
Conversation history with a contact (what was said). |
blip_list_threads |
Recent conversations. |
blip_get_context |
A contact's context variables — the values flow rules evaluate against. (experimental) |
blip_get_context_variable |
One context variable; stateid@{flowId} = where the contact is in a flow. (experimental) |
blip_get_flow |
The published flow definition (blocks + conditions/rules). (experimental) |
blip_list_event_categories |
Event categories your flows track. (experimental) |
blip_get_event_track |
Tracked events for a category (optional date range). (experimental) |
blip_list_flows |
List configured flows (names/hosts only, never secrets). |
blip_map_flow |
Read a flow and write componentized docs (index + one file per block) under flows/<flow>/. |
Write (require BLIP_ALLOW_WRITES=true)
| Tool | Side effect |
|---|---|
blip_send_message |
Sends a message to a real recipient. |
blip_set_bucket |
Writes a value to storage. |
blip_set_contact |
Creates/updates a contact (merge). |
blip_delete_contact |
Permanently deletes a contact. |
Examples (natural language to your MCP client)
- "List the first 5 Blip contacts that came from WhatsApp."
→
blip_list_contacts { take: 5, filter: "substringof('WhatsApp',source)" } - "Ask my bot's knowledge base: what are the opening hours?"
→
blip_ask_ai { text: "what are the opening hours?", mode: "knowledge" } - "Read bucket
onboarding_state." →blip_get_bucket { id: "onboarding_state" } - "Run a raw command: get the active message templates."
→
blip_command { method: "get", uri: "/templates" } - (writes on) "Send 'Hi!' to 5511999999999 on WhatsApp."
→
blip_send_message { to: "[email protected]", content: "Hi!" }
Experimental / unverified endpoints
These were implemented from Blip's documented patterns and the official C# SDK, but not verified against a live account, so they're marked experimental:
- AI / knowledge base (
blip_ask_ai):[email protected],SET /content/analysis(knowledge) andSET /analysis(intent), resource typeapplication/vnd.iris.ai.analysis-request+json. The exact content contract can vary per account. - Broadcast lists (
blip_list_broadcast_lists,blip_list_recipients):[email protected],/listsand/lists/{id}/recipients. - Schedules (
blip_list_schedules):[email protected],/schedules.
If any of these don't match your account, use blip_command with the exact
to/uri/resource from your Blip docs.
Buckets note: bucket commands are sent to your bot's own node (no
to/postmaster), which is the correct Blip behavior — this differs from the[email protected]mentioned in some notes. Override withblip_commandif your setup needs it.
Debugging "why did this contact take this path?"
Blip's HTTP API does not expose a turn-by-turn condition-evaluation log, but you can reconstruct the decision from a few reads and let your MCP client diff them:
blip_get_flow— the exact condition/rule on the branch in question.blip_get_context { identity }— the contact's actual variable values that the rule evaluated against (andstateid@{flowId}for where they are now).blip_get_thread { identity }— what the user actually said / chose.- (optional)
blip_get_event_track— milestones the flow logged.
Then ask, e.g.: "Why did 5511999999999 enter the Support flow instead of Sales?"
Your client reads the rule, sees (say) origem = WhatsApp-Ads in the context and
explains the match — or shows that the variable the rule needed was empty.
These journey tools are experimental and sent to your bot's own node (no postmaster). The richest turn-by-turn view is still the portal's conversation history / Builder debug tool; the API gives you the raw materials to reconstruct it.
Multiple flows & mapping a flow into docs
blip.env (or your MCP env) can hold several flows (Blip bots) — a parent
router plus its subflows, each with its own access key:
BLIP_CONTRACT_ID=mycontract
BLIP_FLOW_NAME=my-router
BLIP_AUTHORIZATION="Key ..." # default flow (the parent / router)
BLIP_FLOW_1_NAME=fila-identificada
BLIP_FLOW_1_AUTHORIZATION="Key ..." # a subflow bot (its own access key)
blip_list_flowsshows what's configured (never the secrets).blip_map_flow { flow: "my-router" }reads the flow and writes a componentized doc tree underflows/<flow>/, so a large flow stays browsable:
.mcp-blip/flows/my-router/
index.md overview + routing graph (block -> who it connects to)
index.json machine-readable map
blocks/
inicio.md what the block does (messages, HTTP/script actions) + its rules
roteador-de-mensagem.md
...
Re-run after editing the flow in Builder (idempotent). CLI: npm run map-flow -- --flow my-router.
The flows/ folder is gitignored by default (business logic). Mapping a subflow's
internals needs that subflow's own access key configured as an extra flow.
Where blip-mcp writes (.mcp-blip/)
Everything the server discovers or documents goes under a single .mcp-blip/
folder in your project root — e.g. blip_map_flow writes to
.mcp-blip/flows/<flow>/. This keeps blip-mcp's output namespaced and out of
the way when you connect it inside a new or existing repo.
Add it (and blip.env) to your project's .gitignore:
.mcp-blip/
blip.env
Override the base with BLIP_DATA_DIR.
How it works
Commands POST to https://<contract>.http.msging.net/commands with header
Authorization: Key <token> and a LIME-style envelope:
{
"id": "<uuid>",
"to": "[email protected]",
"method": "get",
"uri": "/contacts?$skip=0&$take=20"
}
A response with status: "failure" is converted into a clear error carrying
Blip's reason.code and reason.description. Messages POST to /messages.
Publishing to npm
A GitHub Action (.github/workflows/publish.yml) publishes the package whenever
you create a GitHub Release. One-time setup:
- Create an npm account + an automation access token (npmjs.com → Access Tokens → Generate New Token → Automation).
- Add it as a repo secret named
NPM_TOKEN:
(or GitHub → Settings → Secrets and variables → Actions).gh secret set NPM_TOKEN # paste the token when prompted - Create a release — the Action runs typecheck + tests, builds, and publishes:
For later versions, bump first:gh release create v0.1.0 --generate-notesnpm version patch && git push --follow-tags, then create the matching release.
The first publish claims the take-blip-mcp name. After that, users install with
npx -y take-blip-mcp. (A ci.yml workflow runs tests on every push/PR.)
Development
npm run dev # run from source via tsx
npm run build # compile to dist/
npm run typecheck # tsc --noEmit (strict)
npm test # vitest (header assembly, sendCommand, failure, guardrails)
npm run self-test # build first, then validate credentials
Security notes
- Credentials come only from environment variables; nothing is hardcoded.
- The authorization header value is never logged. All logs go to stderr
(stdout is reserved for the MCP protocol) and pass through a redactor that
scrubs the token and any
Key …pattern — even from error bodies. - Writes are off by default (
BLIP_ALLOW_WRITES=false).
License
MIT © Michaeltsg. See LICENSE.
Установка Blip
У этого сервера нет опубликованного пакета — он собирается из исходников. Открой репозиторий и следуй инструкции в README.
▸ github.com/Michaeltsg/mcp-blipFAQ
Blip MCP бесплатный?
Да, Blip MCP бесплатный — установка в пару кликов через Unyly без оплаты.
Нужен ли API-ключ для Blip?
Нет, Blip работает без API-ключей и переменных окружения.
Blip — hosted или self-hosted?
Self-hosted: сервер запускается локально на твоей машине командой из раздела установки.
Как установить Blip в Claude Desktop, Claude Code или Cursor?
Открой Blip на unyly.org, выбери вкладку своего клиента (Claude Desktop, Claude Code, Cursor) и нажми Install — конфиг сгенерируется автоматически, без правки JSON.
Похожие MCP
GitHub
PRs, issues, code search, CI status
автор: GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
автор: mcpdotdirectCompare Blip with
Не уверен что выбрать?
Найди свой стек за 60 секунд
Автор?
Embed-бейдж для README
Похожее
Все в категории development
