MCP server
@cognitiondesk/mcp gives your coding agent the whole platform: create and publish assistants, load knowledge, wire channels, read usage. It runs under your API key, so it can do exactly what that key can do.
128
tools
9
field guides
5
playbooks
Install it locally
In Claude Code, one line:
claude mcp add cognitiondesk \
-e COGNITIONDESK_API_KEY=YOUR_API_KEY \
-- npx -y @cognitiondesk/mcpIn Claude Desktop, Cursor, Windsurf or any other client, add it to the MCP config:
{
"mcpServers": {
"cognitiondesk": {
"command": "npx",
"args": ["-y", "@cognitiondesk/mcp"],
"env": { "COGNITIONDESK_API_KEY": "YOUR_API_KEY" }
}
}
}Then check it:
$ claude mcp get cognitiondesk
cognitiondesk:
Scope: Local config (private to you in this project)
Status: ✔ Connected
Type: stdio
Command: npx
Args: -y @cognitiondesk/mcp"Connected" means the server started and your key was accepted. Ask your agent to "list my CognitionDesk assistants" and it calls list_assistants.
The key comes from the dashboard, under API keys. Without one the server still starts, and every tool answers with a clear error instead of failing silently. API keys and scopes
Or use the hosted server
The same server speaks Streamable HTTP. Nothing to install: your key travels as a header on every request, and the server keeps no key of its own.
claude mcp add --transport http cognitiondesk \
https://mcp.cognitiondesk.com/mcp \
--header "x-api-key: YOUR_API_KEY"Authorization: Bearer <key> works too. A request without a key is rejected at initialize with 401, so you find out while configuring the client, not on your first tool call.
Several clients, one server
If you run assistants for several clients, put every key in one server instead of running one server per client:
{
"mcpServers": {
"cognitiondesk": {
"command": "npx",
"args": ["-y", "@cognitiondesk/mcp"],
"env": {
"COGNITIONDESK_ACCOUNTS": "{\"acme\":\"KEY_FOR_ACME\",\"globex\":\"KEY_FOR_GLOBEX\"}",
"COGNITIONDESK_ACTIVE_ACCOUNT": "acme"
}
}
}
}- get_connection_status lists the accounts the server holds, which one is active and which backend it talks to. It never prints a key.
- use_account switches the active account for everything that follows.
- Every read tool takes an optional account argument to look at another client for that one call. Writes always use the active account.
- Every response starts with account: <name>, so you never read the right answer from the wrong client.
The keyring only exists in local mode. In remote mode each request brings its own key, and an account argument is refused.
Avoid two servers against the same platform: every tool shows up twice, both answer 200, and neither says which account you are in.
Guides and playbooks
The server ships the decisions people get wrong most, so your agent reads them before changing anything. Guides are MCP resources; playbooks are MCP prompts.
Guides (resources)
Where each thing goes: prompt, skill, tool or knowledge
cognitiondesk://guides/donde-va-cada-cosaDraft vs published: which version each channel runs
cognitiondesk://guides/borrador-y-publicadoWho sees what: three systems people mix up constantly
cognitiondesk://guides/quien-ve-queThe assistant's address book: people, channels, rungs and PINs
cognitiondesk://guides/la-agendaWhen the assistant must let go and hand off to a human
cognitiondesk://guides/soltar-a-tiempoWhat spends money, what has a quota, and how to find out BEFORE
cognitiondesk://guides/costos-y-limitesNotes and files: three stores, and which one each thing goes to
cognitiondesk://guides/memoria-y-archivosAPI keys and scopes: the default set, the sensitive ones, and key hygiene
cognitiondesk://guides/scopes-y-keysFacebook Pages: connect, publish on a cadence, measure
cognitiondesk://guides/facebook-pages
Playbooks (prompts)
Build a new assistant, draft-first
assistant-nuevo— An assistant is needed for a case not covered today.Add (or fix) a person on the client's team
alguien-nuevo-en-el-equipo— A team member needs access, or someone already loaded needs a correction.The assistant treats a team member like a stranger
contesta-como-a-un-desconocido— The client says the assistant answers someone on their team poorly, too little, or "as if it did not know them".Why can't I, and what would fix it
diagnostico-de-limites— A call failed with 401/403/429, or you are about to do something in bulk and want to know if the plan holds.Take an assistant live, without guessing
poner-en-produccion— A draft assistant looks ready and the human wants it in front of customers.
Every tool
Generated from the server itself, not written by hand: npm run tools:al-dia fails if this table and @cognitiondesk/mcp drift apart. Descriptions stay in English because that is what your agent reads.
@cognitiondesk/mcp · Version 0.11.1 · 128 tools
Connection & accounts · 4
get_connection_status | Check the configured API key: masked identity, plan usage, and which assistants it may manage.read-only |
list_projects | The organization's projects (the org → project tenancy structure).read-only |
list_scopes | Every permission the platform defines, in one call: agent capabilities (what an ASSISTANT may do inside a chat), API key scopes (what a PROGRAM from outside may do), and the audience rungs (guest/contact/staff/owner).read-only |
use_account | Switch which account of this server's keyring every following tool call uses, until the process restarts or you switch again. |
Assistants · 12
assign_workflow_to_assistant | Assign (or unassign) a workflow to an assistant. |
create_assistant | Create a new assistant. |
delete_assistant | Delete an assistant permanently.destructive |
get_assistant | Get a single assistant by id.read-only |
get_assistant_access | Read the audience policy of an assistant: audiencePolicy.roleLevels (which business role maps to which rung) and any access gates.read-only |
list_assistant_versions | Published versions of an assistant, newest first, with which one is LIVE.read-only |
list_assistants | List all assistants owned by the API key.read-only |
publish_assistant | Freeze the current draft of an assistant as an immutable version and point the LIVE bot at it. |
rollback_assistant | Point the LIVE bot back at an earlier published version, instantly, without touching the draft. |
set_assistant_access | Replace the audience policy of an assistant (roleLevels and gates). |
try_assistant | Talk to an assistant and read what it actually answers. |
update_assistant | Patch fields on an existing assistant. |
Audience & handoff · 9
delete_assistant_contact | Stop recognising ONE identity of someone.destructive |
delete_assistant_person | Stop recognising a person EVERYWHERE — all their channels at once.destructive |
delete_handoff_contact | Remove a handoff target.destructive |
get_identity_audit | Who proved who they are, who tried and failed, and when — the assistant's identity log.read-only |
list_assistant_contacts | Who the assistant recognises.read-only |
list_handoff_contacts | The humans an assistant can hand a customer off to.read-only |
upsert_assistant_contact | Register (or update) ONE identity of someone the assistant should recognise. |
upsert_assistant_person | Register or edit a PERSON with every way they reach the assistant, in one call. |
upsert_handoff_contact | Add or update a handoff target: who receives the customer when the assistant lets go, and through which channel. |
Knowledge · 13
delete_knowledge_entry | Remove an entry and its chunks from the knowledge base.destructive |
estimate_knowledge_ingest | Price an ingest BEFORE doing it: estimated tokens, chunks, and whether it fits the plan's embedding quota.read-only |
get_knowledge_entry | One knowledge entry in full: source, training status, whether it is vectorized.read-only |
get_knowledge_stats | How much the assistant actually has to answer from: entries, chunks and embeddings.read-only |
ingest_knowledge_document | Embed an ALREADY-UPLOADED document (by its documentId) into the knowledge base. |
ingest_knowledge_github | Ingest a GitHub repository into the knowledge base. |
ingest_knowledge_image | Ingest an image into the knowledge base: vision describes it and the description gets embedded, so the assistant can answer questions about what is IN the image. |
ingest_knowledge_text | Write something into the knowledge base as text — the fastest way to fix "the assistant does not know X". |
ingest_knowledge_url | Pull one or more web pages into the knowledge base. |
knowledge_maintenance | Under-the-hood maintenance of the knowledge base — for diagnosing retrieval, not for everyday ingest (that is ingest_knowledge_*). |
list_knowledge_entries | What is actually in the knowledge base, entry by entry.read-only |
search_knowledge | Search what the assistant knows and has written down — the knowledge base it answers from.read-only |
update_knowledge_entry | Patch a knowledge entry's metadata (title, description, category, tags). |
Skills · 12
create_skill | Create a reusable skill. |
delete_skill | Delete a custom skill.destructive |
export_skill | Export a skill as portable JSON — the way a skill travels between accounts (pair with import_skills).read-only |
get_skill | One skill in full: its prompt, the tools it carries and where it came from.read-only |
import_skills | Import skills from an export payload (see export_skill). |
list_builtin_skills | The platform's built-in skills — registered at startup, read-only.read-only |
list_skill_packs | Curated skill packs: ready-made bundles for common business types (appointments, e-commerce, CRM...).read-only |
list_skills | Every skill this account can put on an assistant — built-ins plus the org's own, grouped by scope (system / organization / user / imported).read-only |
resolve_skills | Turn a list of skillIds into what they ACTUALLY produce: the concrete tools they add and the text they append to the system prompt.read-only |
skill_collections | Skill collections: named groups of skills so a whole capability set is assigned as one thing. |
toggle_skill | Turn a skill on or off without deleting it — the reversible way to take a behaviour out of circulation while you work out whether it was the cause of something. |
update_skill | Edit a custom skill. |
Custom tools · 5
create_custom_tool | Create a custom tool the assistants can call. |
delete_custom_tool | Delete a custom tool permanently.destructive |
get_custom_tool | Get one custom tool by id.read-only |
list_custom_tools | List the custom tools owned by the API key.read-only |
update_custom_tool | Patch a custom tool (displayName, description, config, inputSchema, enabled, minAudience…). |
Workflows · 9
create_workflow | Create a workflow (LangGraph node/edge graph). |
get_workflow | Get a single workflow by id.read-only |
get_workflow_analytics | Get run analytics for a workflow.read-only |
list_workflow_versions | List published versions of a workflow.read-only |
list_workflows | List workflows, optionally filtered by category/tags/enabled.read-only |
publish_workflow | Publish the current draft of a workflow as an immutable version. |
run_workflow | Run/test a workflow with an optional input payload. |
update_workflow | Update a workflow draft (name/description/nodes/edges/category/tags — send only the fields to change). |
workflow_templates | Reusable workflow templates (squads are templates with kind "squad"). |
Schedules, reports & loops · 7
get_report | Full report by id: signed summary plus the deterministic source it was written over (auditable).read-only |
list_reports | Reports issued by schedules — every one carries its issue date and its author signature (kind · name · model).read-only |
list_schedule_runs | Run history of a schedule: status, lateness (said, not hidden), what each run produced.read-only |
list_schedules | List scheduled tasks (schedules): status, human-readable "when", next run in the tenant timezone.read-only |
manage_loops | Loops: recurring autonomous work items an agent claims and reports on, iteration by iteration. |
pause_schedule | Pause or resume an ACTIVE/PAUSED schedule. |
propose_schedule | Propose a scheduled task (proactivity check). |
Squads · 5
cancel_wizard | Cancel a wizard session that is stuck or no longer wanted. |
create_squad | Create a squad (a team of assistants + an orchestrator workflow) from a one-line goal. |
create_squad_from_template | Materialize a squad from an existing template — faster than create_squad when a suitable template already exists. |
get_wizard_status | State of a wizard session (the guided flow behind create_squad): current step, what it already knows, what it is waiting for.read-only |
list_squad_templates | List reusable squad templates available to this organization.read-only |
Channels & widget · 6
create_web_widget | Give an assistant an embeddable web chat widget — the channel a website visitor talks through. |
get_web_widget | One web widget in full: its allowedDomains, its assistant, whether it is switched on, and its embed key.read-only |
list_channel_types | The channel catalog: which channel types exist, their family, and what each one can render.read-only |
list_channels | Every channel that can reach this account's assistants: connected messaging, embedded web widgets and SDK/code connections.read-only |
update_web_widget | Edit a live web widget — above all its allowedDomains, the list that decides whether the chat answers or returns 403. |
widget_identity | The web widget's IDENTITY SECRET — lets the site that embeds the widget tell the chat, with a signature, who the visitor is (Intercom-style identity verification). |
Social publishing · 11
connect_facebook_page | Connect a Page from list_facebook_pages → `available` (the human already authorized it in Meta). |
connect_youtube_channel | Start connecting a YouTube channel. |
get_facebook_page_insights | Followers and the page metrics of the last N days (views, reach, engagement, follows), summed and per day.read-only |
list_facebook_pages | The Facebook Pages of this CognitionDesk account: `connected` (usable now, with their connectionId) and `available` (the human already authorized them in Meta but they are not connected yet — connect_facebook_page).read-only |
list_facebook_posts | What a connected Page published (with reactions, comments, shares and permalink) and what is SCHEDULED in Meta and not out yet.read-only |
list_social_connections | The publishing accounts connected to this CognitionDesk account (YouTube channels; Facebook Pages are listed by list_facebook_pages), plus which networks can be connected from here.read-only |
list_youtube_videos | The latest videos of a connected YouTube channel with their privacy, upload status and views/likes/comments.read-only |
queue_social_piece | Put ONE human-approved piece in the publishing queue (social_pieces) of a brand and network. |
schedule_facebook_post | Publish on a connected Page: now, SCHEDULED (scheduledAt, 10 minutes to 30 days ahead — Meta's own scheduler, it goes out even if our server is down) or as a hidden draft (published:false). |
update_youtube_video | Change a video already on a connected YouTube channel: title, description, tags, privacy, thumbnail. |
upload_youtube_video | Upload a video file from THIS machine to a connected YouTube channel, optionally with its thumbnail. |
Agenda · 4
agenda_calendar_link | The agenda as a calendar you subscribe to from Google Calendar, Apple Calendar or Outlook (an iCal link). |
get_agenda | The key owner's agenda settings: working hours per weekday, timezone, default duration, minimum notice, how far ahead people can book, appointment types, intake fields — and whether a calendar link (iCal) is active.read-only |
list_agenda_appointments | The meetings and appointments on the key owner's agenda — who, when (UTC + the agenda's timezone), how long, status, contact details and notes.read-only |
update_agenda | Change the key owner's agenda: working hours, timezone, default duration, minimum notice, booking window, appointment types. |
Inventory · 7
get_import_status | Get the status and report of an inventory import by id ({ status, totalRows, report: { created, updated, skipped, errors } }).read-only |
import_inventory_items | Bulk import products/items into the inventory. |
list_import_sources | List configured inventory import sources — external product APIs (the client's own database/endpoint) connected to the inventory.read-only |
list_inventory | List the inventory/catalog items (products, services) owned by the API key owner.read-only |
list_inventory_imports | Import history: every bulk import with its report (created/updated/skipped/errors).read-only |
seed_inventory | Seed the inventory with starter items for a business type. |
sync_import_source | Sync now: fetch all products from a configured external API source and import them (upsert by SKU with the source's saved mapping). |
Tasks · 7
create_task | Create a work item. |
delete_task | Delete a task.destructive |
get_task | One task in full, with its assignee and history.read-only |
get_tasks_analytics | Task analytics over time: creation/completion trends and distribution.read-only |
get_tasks_summary | Deterministic snapshot of the key owner's tasks: counts by status, overdue, due within 48h, stuck in review, and 7-day throughput.read-only |
list_tasks | The work items in a scope: personal, project or organization.read-only |
update_task | Change a task — status, priority, assignee, anything. |
Memory & files · 3
agent_workspace | The user's personal workspace of notes and saved items: free-form, foldered, searchable. |
assistant_files | Each assistant's PRIVATE filesystem: what that agent wrote down while working (notes, drafts, traces), organized in layers. |
user_memory | The structured memory files the platform keeps ABOUT the user (who they are, preferences, business) — what the Copilot has learned. |
Email campaigns · 2
create_email_campaign_draft | Create an email campaign as a DRAFT. |
list_email_campaigns | Email campaigns of the account, with status.read-only |
Images · 1
generate_image | Generate an image and store it in the account's media. |
Receivables · 1
manage_receivables | Receivables (money owed to the account owner): summary, receivable projects, receivables and payments. |
Usage & plans · 4
check_action_permission | Check whether the current plan allows an action before attempting it (e.g.read-only |
get_available_plans | List available billing plans and their limits.read-only |
get_usage | Get the current plan and usage/quota snapshot for the API key owner.read-only |
get_usage_analytics | Get usage analytics over a period (default 30d).read-only |
API keys · 6
create_api_key | Create a new API key for the same account as the configured key. |
delete_api_key | Permanently delete an API key.destructive |
get_api_key_stats | Get usage stats for a single API key.read-only |
list_api_keys | List API keys owned by the same account as the configured key.read-only |
revoke_api_key | Deactivate an API key (reversible via update_api_key on isActive if ever exposed — today this is one-way in the UI too).destructive |
update_api_key | Rename a key or change its allowedAssistantIds. |
When it answers 403
The tool reached the platform and the platform said no. Two causes, and neither is fixed by editing the assistant:
- The key lacks the scope. Each tool needs one (assistants:*, knowledge:write…). Create a key with that scope, or ask list_scopes which one it is.
- PLAN_REQUIRED: the account is on a free plan. The MCP needs Pro or Business.
Want to expose one assistant instead?
Each assistant is also its own MCP server with only the tools you granted it. That is a different thing:
One assistant as an MCP server