headlo-mcp
OfficialClick on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@headlo-mcp show me my sites and workspaces"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
headlo-mcp
MCP server for Headlo — gives Claude Desktop and Claude Code access to your Headlo collections, records, pages, and components.
Use it as a standalone server, or install as a library to add your own tools and intercept built-in ones.
Quickstart
Claude Desktop
Edit claude_desktop_config.json (Mac: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\):
{
"mcpServers": {
"headlo": {
"command": "npx",
"args": ["headlo-mcp"],
"env": {
"HEADLO_API_TOKEN": "hl_pat_your_token_here"
}
}
}
}Restart Claude Desktop. You should see the Headlo tools available.
Claude Code
claude mcp add headlo -e HEADLO_API_TOKEN=hl_pat_your_token_here -- npx headlo-mcpRemote MCP (no install)
If you don't need to extend the server, point Claude directly at the Headlo API:
claude mcp add headlo https://api.headlo.com/v1/mcp --header "Authorization: Bearer hl_pat_your_token_here"Related MCP server: GigAPI MCP Server
Extending the server
Install as a library to add your own tools or intercept built-in ones:
npm install headlo-mcp @modelcontextprotocol/sdkAdd custom tools
import { createHeadloServer } from 'headlo-mcp'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { z } from 'zod'
const server = createHeadloServer()
// your own tool alongside the built-ins
server.tool('my_crm_lookup', 'Look up a contact in my CRM', { email: z.string() }, async ({ email }) => {
const contact = await myCRM.find(email)
return { content: [{ type: 'text', text: JSON.stringify(contact) }] }
})
await server.connect(new StdioServerTransport())Intercept built-in tool calls
Pass a wrap map to run code before or after any built-in tool:
import { createHeadloServer } from 'headlo-mcp'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
const server = createHeadloServer({
wrap: {
// validate before creating a record, sync to CRM after
create_record: async (args, next) => {
await mySchema.validate(args)
const result = await next(args)
await myCRM.push(result)
return result
},
// log every CAP session to your analytics
cap_capture_expert: async (args, next) => {
const result = await next(args)
await myAnalytics.track(args.cap_id, result)
return result
},
}
})
await server.connect(new StdioServerTransport())next(args) calls the original Headlo handler. You can modify args before passing them, or modify the result before returning it.
Environment variables
Variable | Required | Description |
| Yes | Your Headlo API token ( |
| No | API base URL (default: |
| No | Anon key for public tool calls |
Built-in tools
Context
Tool | Description |
| List all sites and workspaces — call this first |
Collections
Tool | Description |
| List all collections in a workspace |
| Create a new collection with a schema |
| Update a collection label or schema |
Records
Tool | Description |
| List records in a collection (includes drafts) |
| Get a single record by ID |
| Create a new record |
| Update a record (partial — only provided fields change) |
| Delete a record |
Pages
Tool | Description |
| List all pages for a site |
| Create a new page |
| Update a page title, layout, or status |
Modules
Tool | Description |
| List all modules on a page |
| Add a module to a page slot |
| Update a module's record, options, or template |
| Remove a module from a page |
Public
Tool | Description |
| List modules on a page (anon auth) |
| Get a single module (anon auth) |
CAP (Context Accumulation Protocol)
CAP is Headlo's expert intake system — structured question flows backed by pre-researched knowledge that produce better AI answers than generic prompts.
Tool | Description |
| Create a new CAP with intake questions and knowledge probes for a question on the Ask network |
| Run a CAP as a live multi-turn intake session — call with empty message to start, pass answers in subsequent calls |
| Conversationally edit an existing CAP — add/remove questions, edit options |
Running a CAP session (multi-turn):
// Turn 1 — load the CAP (empty message)
const t1 = await cap_capture_expert({ cap_id: 'abc123def456', message: '' })
// → { response: "Question 1 of 3: ...", session_state: {...}, complete: false }
// Turn 2 — answer the first question, pass session_state back
const t2 = await cap_capture_expert({ cap_id: 'abc123def456', message: 'Downtown', session_state: t1.session_state })
// → { response: "Question 2 of 3: ...", session_state: {...}, complete: false }
// Turn 3 — final answer
const t3 = await cap_capture_expert({ cap_id: 'abc123def456', message: 'Coffee shops', session_state: t2.session_state })
// → { response: "...", complete: true, answer: "..." }Intercepting CAP calls with middleware:
const server = createHeadloServer({
wrap: {
cap_capture_expert: async (args, next) => {
const result = await next(args)
// log every completed session to your analytics
if (result.complete) await myAnalytics.track(args.cap_id, result)
return result
},
}
})Onboarding
Tool | Description |
| Create a new agency/workspace |
| Create a new site |
| Save logo and brand color |
| Get current onboarding step |
License
Elastic License 2.0 — © Headlo
Source available. Free for internal use. Production self-hosting requires a commercial license.
Built by Headlo.
Available Tools
25 toolscap_capture_expertA
Run an existing CAP (Context Accumulation Protocol) as a live intake session. Pass cap_id and an empty message to load and start the first question. Answer each question in subsequent calls. On completion returns a synthesized answer built from the CAP knowledge pairs. Returns { response, session_state, complete, answer? } as JSON.
Inputs: cap_id (required), message, session_state.
cap_edit_expertA
Conversationally edit an existing CAP — add questions (with AI-generated knowledge probes), remove questions, or edit multiple-choice options. Pass cap_id and empty message to load. Returns { response, session_state, complete, cap_id? } as JSON.
Inputs: cap_id (required), message, session_state.
create_collectionC
Create a new collection
Inputs: label (required), workspace_id (required), collection_id (required), schema.
create_expert_protocolB
Create a CAP (Context Accumulation Protocol) for a question on the Headlo Ask network. Before writing any knowledge probes, always do a web search to gather current, specific facts. Each probe answer must contain 4–6 specific facts sourced from your research.
Inputs: bounty_id (required), questions (required).
create_moduleC
Add a module to a page slot
Inputs: page_id (required), slot_id (required), template_id (required), collection_id, +2 more.
create_pageC
Create a new page
Inputs: page_id (required), site_id (required), layout_id (required), title.
create_recordC
Create a new record in a collection
Inputs: data (required), collection_id (required), status, workspace_id.
create_siteB
Create a new site under the active agency
Inputs: name (required).
delete_moduleB
Remove a module from a page
Inputs: confirm (required), module_id (required).
delete_recordD
Delete a record
Inputs: confirm (required), record_id (required), collection_id (required), workspace_id.
get_contextA
Get all sites and workspaces for the active agency — call this first to orient yourself
Inputs: no named parameters.
get_moduleB
Get a single module with its records (public, anon key auth)
Inputs: module_id (required).
get_onboarding_progressA
Get the current onboarding step and completion status
Inputs: no named parameters.
get_recordA
Get a single record by ID with all field values
Inputs: record_id (required), collection_id (required), workspace_id.
list_collectionsA
List all collections for the active workspace
Inputs: workspace_id.
list_modules_editorB
List all modules on a page (editor auth)
Inputs: page_id (required).
list_page_modulesA
List all modules on a page with their records (public, anon key auth)
Inputs: page_id (required).
list_pagesB
List all pages for a site
Inputs: site_id (required).
list_recordsC
List records in a collection (includes drafts)
Inputs: collection_id (required), limit, offset, status, +1 more.
save_brandingC
Save branding details for the active agency
Inputs: logo_url, primary_color.
setup_agencyA
Create a new agency/workspace during onboarding
Inputs: name (required).
update_collectionB
Update a collection label or schema
Inputs: collection_id (required), label, schema.
update_moduleB
Update a module — change its record, options, or template
Inputs: module_id (required), template_id, template_options, collection_record_id.
update_pageC
Update a page title or layout
Inputs: page_id (required), title, status, layout_id.
update_recordA
Update a record — partial update, only provided fields are changed
Inputs: record_id (required), collection_id (required), data, status, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 25 tools
Most tools have a clear and distinct resource+action purpose (e.g., create_record vs update_record, list_pages vs create_page). The main confusion risk is between list_page_modules and list_modules_editor, which differ only by auth context, and possibly get_module vs list_page_modules, though the singular/plural distinction helps.
The dominant pattern is verb_noun (get_context, create_site, update_record), but there are notable deviations: 'cap_capture_expert' and 'cap_edit_expert' use a prefix and less predictable structure, and 'list_modules_editor' is inconsistent with 'list_page_modules'. Overall still readable but not uniform.
25 tools is at the high end but well-justified given the server covers multiple domains: onboarding, sites, pages, collections, records, modules, and expert protocols. Each tool serves a distinct purpose, though the count feels slightly heavy for a single server.
There are significant lifecycle gaps: no delete or update for sites, no delete for pages, no delete for collections, and no get_collection or update_site. Records and modules have full CRUD, but the broader content model lacks essential operations that agents would likely need.
Maintenance
Related MCP Connectors
One MCP server for all your MCP servers: code mode, per-tool permissions, approvals and audit.
MCP server for managing FormDesigner forms, fields, logic rules, themes, and entries
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Related MCP Servers
- FlicenseBqualityDmaintenanceAn MCP server that enables Claude Desktop to communicate with A2A protocol agents, allowing Claude to access extended capabilities through agent interactions.322-
- AlicenseCqualityDmaintenanceAn MCP server that provides seamless integration with Claude Desktop for querying and managing timeseries data in GigAPI Timeseries Lake.76Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA local MCP server for Claude Desktop with persistent task management, file operations, document generation, and PDF indexing.547 npm1MIT
- AlicenseNot gradedqualityDmaintenanceA modern MCP server that provides Claude Desktop with the ability to store and retrieve personal information locally.1MIT