MCP · streamable HTTP · JSON-RPC 2.0
The same knowledge base an agent can call.
One endpoint, one bearer token, eight tools. Every price comes back with its kind and its source, and a missing figure comes back as null rather than an estimate.
Endpoint
https://formation.labshero.ai/mcp
POST only. A GET returns 405. The protocol version is 2025-06-18 and responses are JSON, not SSE.
Authentication
Send Authorization: Bearer <token>. The token is set on the server from the environment. If no token is configured the endpoint returns 503 instead of opening.
Tools
| Name | What it answers |
|---|---|
| search_knowledge | Search zones, guides, competitors and government systems. Returns typed hits with the page path. |
| list_zones | List researched free zones and mainland jurisdictions. total is our own first-year sum for a licence with no visas, present only when every part is proven; absent means not yet confirmed. |
| get_zone | One zone with its packages, every fee, coworking, company and licence types, process, documents, portal, compliance, gaps and sources. |
| compare_zones | Rank zones by the first-year total we build from proven parts for an activity, a number of visas and a workspace. A zone has a total only when every required part is proven; otherwise it is listed with the missing parts and no total. Any number is a proven value or the string NotYetConfirmed, never zero. |
| get_topic | One topic guide: corporate tax, VAT, audit, financial year, banking, UBO/ESR/AML, visas, golden visa, renewal, free zone vs mainland, compliance calendar or closing a company. |
| get_compliance_calendar | Annual and recurring obligations for one zone or all zones, ordered by when they fall due after the financial year ends. |
| list_competitors | Formation agents and resellers, their headline prices, fee model, digital experience, complaints and the weaknesses a transparent service can exploit. |
| get_sources | Every source behind the knowledge base, with the day it was read, optionally filtered to one kind and one target. |
| search_regulations | Search the official regulation texts (full text, English) and return the documents and articles that match, each with its document title, article, official URL and a text excerpt. An empty corpus returns an empty list. |
| list_conversations | List customer conversations across WhatsApp, email and web chat, newest activity first, with the latest message. |
| get_conversation | Read one conversation with its contact and its most recent messages. |
| send_message | Send a message to a customer on one channel. Provide conversation_id or contact_channel_id, or a channel_type with channel_address. On WhatsApp, free text is allowed only inside the 24 hour window that starts with the customer's last inbound; outside it, send an approved template_name. With no provider credentials the message is recorded as dry_run. |
| mark_handled | Resolve a conversation. It closes and records who or what resolved it and why. |
| assign_conversation | Assign a conversation to a human or an agent, or unassign it. |
| list_calls | List phone calls, newest first, with direction, counterpart, duration, disposition and recording metadata. |
| get_call | Read one call record, including the linked conversation and recording metadata. |
| start_call | Start an outbound call through the provider: it rings our number first, then the customer. Without provider credentials the call intent is recorded as dry_run. |
One exchange, start to finish
Three requests: initialize, list the tools, then price a path. The id is yours to choose; the server echoes it.
POST https://formation.labshero.ai/mcp
Authorization: Bearer $CF_MCP_TOKEN
Content-Type: application/json
Accept: application/json, text/event-stream
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}
{"jsonrpc":"2.0","id":2,"method":"tools/list"}
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"compare_zones","arguments":{"activity":"services","visas":1,"office":"none"}}}
JSON API
The website, the API and MCP read through one query layer, so a number does not differ between them.
| Path | Returns |
|---|---|
| /api/v1/zones | Every zone, with filters q, emirate, north, remote_only, official_only |
| /api/v1/zones/{slug} | One zone with packages, fees, process, documents, compliance and integration |
| /api/v1/compare | Ranked zones for activity, visas and office |
| /api/v1/topics | Guide index; /api/v1/topics/{slug} for one guide |
| /api/v1/activities | Activity index; /api/v1/activities/{slug} for one |
| /api/v1/banks | Bank index; /api/v1/banks/{slug} for one |
| /api/v1/competitors | Competitor profiles with prices |
| /api/v1/government | Government systems with fees |
| /api/v1/compliance-calendar | Every obligation, optionally one zone |
| /api/v1/search?q= | Hits across zones, guides, activities, banks, competitors and systems |
| /api/v1/sources | Every source, filtered by kind and slug |
What is not built
Starting an application, uploading a document and paying are not exposed as tools yet. The MCP answers from the knowledge base; it does not file.