User Guide  |  v1.0.0  |  April 2026

Exosphere MCP Factory

How to Generate MCP Servers from Estate Manifests
System Integrators Telecoms Engineers Solution Architects BSS Teams
Document TypeUser Guide
Version1.0.0
IssuedApril 2026
Produced byBlue Note Logic
Live Endpointfactory.exos.bluenotelogic.com
AuthHTTP Basic Auth
Contents
01 — Overview

What the Factory Does

The Exosphere MCP Factory is a web service and API that generates complete, deployable MCP (Model Context Protocol) server packages from an Estate Manifest JSON file. You provide a JSON description of your BSS estate; the factory returns a ready-to-deploy TypeScript/Node.js MCP server in under 50ms.

Live Endpoint The factory is available at https://factory.exos.bluenotelogic.com. Authentication uses HTTP Basic Auth — credentials are provided separately by Blue Note Logic.

The Pipeline in One Sentence

You describe your BSS estate in JSON. The factory turns that description into working code. You deploy the code. AI agents can now query your BSS systems in plain language.

What is an MCP Server?

An MCP server is the bridge between an AI agent — Claude, GPT-4o, Azure Copilot, Dify, or any LLM with tool-use capability — and your BSS systems. The AI agent calls MCP tools by name: show-latest-bill, get-products, check-order-status. The MCP server translates those calls into real API requests to your billing system, product catalogue, order management platform, or CRM — and returns structured data the AI can reason about.

Without an MCP server, an AI agent cannot act on live BSS data. It can only reason about static information in its training corpus or in documents you paste into the prompt. With an MCP server, the agent has live, authoritative access to customer accounts, invoices, service orders, and support tickets — in real time, on every query.

What the Factory Generates

Given an Estate Manifest, the factory produces a complete Node.js package containing all of the following:

No code generation AI is involved — the factory uses a deterministic template engine. The output is always predictable, auditable, and reproducible from the same manifest. You can version-control the manifest and regenerate the server at any time.

Generation speed: For a typical manifest with 4 adapters and 6–13 tools, the factory generates and packages the full server in under 50 milliseconds. The ZIP file is typically 180–240 KB.

Where the Factory Fits (Cartographer → Factory Pipeline)

The Factory is Stage B of the Exosphere Agentic BSS pipeline. Stage A — the Cartographer — is an AI agent that analyses a live BSS estate and automatically produces an Estate Manifest. Stage B — the Factory — takes that manifest and generates the MCP server.

You can use the Factory standalone today: write a manifest by hand (or start from the provided examples) and generate the server immediately. When the Cartographer is available, the two stages will be chainable: point the Cartographer at your BSS, receive a manifest, feed it to the Factory, and receive a deployable MCP server — with no manual authoring required.

02 — Getting Started

Quick Start

From zero to a deployable MCP server in three steps. No local tooling required for steps 1–3 — everything runs in the browser.

1
Open the Factory UI
Navigate to https://factory.exos.bluenotelogic.com in your browser. You will be prompted for HTTP Basic Auth credentials. Enter the username and password provided by Blue Note Logic. Once authenticated, you will see the factory interface: a manifest editor on the left, an examples panel on the right, and a "Generate MCP Server" button at the bottom.
2
Load or Write an Estate Manifest
Click "Load Example" in the examples panel to populate the editor with the FOSSbilling demo manifest — a pre-configured example for a Caribbean telecoms operator using FOSSbilling for billing and SuiteCRM for customer care. This is the fastest way to see a valid manifest structure. Alternatively, paste your own manifest JSON directly into the editor. The editor validates your JSON in real time and highlights schema errors before you attempt generation. See Section 3 for the full manifest reference.
3
Generate and Download
Click "Generate MCP Server". The factory validates your manifest, processes the template engine, assembles all TypeScript files, and returns a download link for the ZIP package — typically in under 50ms. The ZIP contains a complete, self-contained Node.js package ready for deployment. See Section 8 for deployment instructions.
API Access All three steps can also be performed programmatically via the REST API. See Section 7 for the full API reference. The UI is a thin wrapper around the same POST /generate endpoint.
03 — Manifest Reference

Estate Manifest Reference

The Estate Manifest is a JSON document that describes your BSS estate — which systems you operate, how to authenticate with them, what data fields they expose, and which MCP tools to enable. It is the single input to the Factory.

Below is a complete annotated manifest showing all supported fields. Fields shown with { ... } follow the same structure as the preceding adapter — see Section 4 for per-adapter details.

JSON — Estate Manifest (complete structure)
{
  "manifest_version": "1.0",

  "customer": {
    "name":   "Your Telecom Name",
    "id":     "your-telecom-id",
    "region": "caribbean"
  },

  "adapters": {

    "billing": {
      "type":     "fossbilling",
      "base_url": "https://your-fossbilling.example.com",
      "auth": {
        "type":    "token",
        "env_var": "FOSSBILLING_TOKEN"
      },
      "capabilities": {
        "invoices": {
          "field_map": {
            "total":        "totalAmount",
            "nr":           "invoiceNumber",
            "date_created": "issueDate",
            "due_date":     "dueDate",
            "status":       "status",
            "currency":     "currency"
          },
          "status_map": {
            "paid":      "settled",
            "unpaid":    "new",
            "refunded":  "disputed",
            "cancelled": "onHold"
          }
        }
      }
    },

    "product": {
      "type":     "product-catalog",
      "base_url": "https://your-product-catalog.example.com",
      "auth": {
        "type":    "token",
        "env_var": "PRODUCT_CATALOG_TOKEN"
      },
      "capabilities": {
        "products": {
          "field_map": {
            "id":        "productId",
            "title":     "productName",
            "price":     "monthlyPrice",
            "is_active": "available"
          }
        }
      }
    },

    "order": {
      "type":     "order-management",
      "base_url": "https://your-orders.example.com",
      "auth": {
        "type":    "token",
        "env_var": "ORDER_MGMT_TOKEN"
      }
    },

    "care": {
      "type":     "suitecrm",
      "base_url": "https://crm.your-telecom.example.com",
      "auth": {
        "type":       "oauth2",
        "client_id": "your-oauth2-client-id",
        "env_var":   "SUITECRM_CLIENT_SECRET"
      }
    }

  },

  "tools": {
    "enabled": [
      "show-latest-bill",
      "compare-latest-bill",
      "place-a-new-order",
      "get-products",
      "check-order-status",
      "get-open-tickets"
    ]
  }

}

Field Reference: Top-Level Sections

FieldTypeRequiredDescription
manifest_version string Required Schema version. Must be "1.0". The factory rejects manifests with unknown or missing versions.
customer object Required Operator metadata. Used in generated comments, README, and package.json. Does not affect runtime behaviour.
customer.name string Required Human-readable operator name. Appears in the generated README and TypeScript file headers.
customer.id string Required URL-safe identifier. Used in generated package names. Use lowercase letters and hyphens — no spaces.
customer.region string Optional Geographic region label (e.g. "caribbean", "nordic", "mena"). Informational only.
adapters object Required Map of adapter configurations. Keys are adapter roles: billing, product, order, care. At least one adapter must be present.
tools.enabled string[] Required List of tool names to generate. Must contain at least one entry. See Section 5 for all valid tool names. Tool names are case-sensitive and hyphen-delimited.

Field Reference: Adapter Object

FieldTypeRequiredDescription
type string Required Adapter system type. One of fossbilling, product-catalog, order-management, suitecrm.
base_url string Required Full base URL for the BSS system (no trailing slash). Injected as a constant in the generated adapter file.
auth.type string Required Authentication scheme. token for API key / bearer token; oauth2 for client credentials OAuth2.
auth.env_var string Required Name of the environment variable that will hold the credential at runtime. Added to .env.example automatically.
auth.client_id string OAuth2 only OAuth2 client ID (static, baked into generated code). The client secret is read from auth.env_var at runtime.
capabilities object Optional Capability-specific config containing field_map and status_map. If omitted, the adapter uses raw field names from the BSS API response.
04 — Adapters

Supported Adapters

An adapter is a generated module that handles all communication with one BSS system type. The factory currently supports four adapter types, covering the core BSS estate of a typical telecoms operator.

Adapter RoleType ValueBSS SystemAuth SchemeDescription
Billing fossbilling FOSSbilling API Token Invoice management, payment history, billing disputes. Supports invoice listing, retrieval, comparison, and order placement via the FOSSbilling Admin API.
Product product-catalog Generic Product Catalogue API API Token Product catalogue queries, plan details, pricing, and availability checks. Designed to wrap any REST-based product catalogue with a consistent interface.
Order order-management Generic Order Management API API Token Order status tracking, provisioning lifecycle, port-in/port-out requests. Returns structured order records the AI agent can interpret and report to the end customer.
Care suitecrm SuiteCRM (V8 API) OAuth2 Bearer Customer records, open support tickets, case creation and retrieval. Uses the SuiteCRM V8 JSON:API with client credentials OAuth2 flow.
Adapter Extension Additional adapter types — Netcracker OSS, Amdocs OMS, WHMCS — are on the roadmap. New adapter types are delivered as manifest schema extensions; your existing manifests remain valid. Contact Blue Note Logic to discuss custom adapter requirements.

Adapter Dependencies

Adapters are only generated if at least one tool in tools.enabled requires that adapter. If you enable only billing tools, only the billing adapter file is generated — product, order, and care files are not included in the ZIP. This keeps the generated package minimal and avoids unused dependencies.

The inverse also applies: if you declare an adapter in the manifest but enable no tools for it, that adapter is silently omitted. There are no empty adapter files in the output.

05 — Tools

Available Tools

The factory supports 13 MCP tools across the four adapter types. Each tool is independently enableable via tools.enabled in the manifest. You can enable any subset — from a single tool up to all 13.

Tool NameAdapterCategoryDescription
show-latest-bill billing Invoicing Retrieve the most recent invoice for a customer account. Returns invoice number, amount, currency, issue date, due date, and semantic status.
compare-latest-bill billing Invoicing Retrieve the two most recent invoices, compute the delta, and return a structured comparison object the AI agent can describe in plain language.
place-a-new-order billing Ordering Create a new service order for a customer account. Accepts product ID, quantity, and optional order notes. Returns the new order reference. Write operation — requires confirmation.
get-invoice-history billing Invoicing List all invoices for an account with an optional date range filter (from / to ISO date parameters). Returns a paginated list of invoice summaries.
pay-invoice billing Payments Mark a specific invoice as paid. Write operation — the generated tool includes a confirmation parameter that the AI agent must confirm with the end user before execution.
get-products product Catalogue List available products and service plans with pricing. Accepts optional category and availability filters. Returns a structured product list.
get-product-details product Catalogue Retrieve full details for a specific product or plan by ID. Returns all fields including technical specifications, pricing tiers, and eligibility requirements.
check-service-availability product Availability Check whether a product is available for a specific location or service address. Returns a boolean availability flag plus any blocking reasons.
check-order-status order Fulfilment Get the current status and estimated completion date for a specific order. Returns order stage, last-updated timestamp, and any blocking issues.
list-active-orders order Fulfilment List all pending and in-progress orders for a customer account. Returns a summary list with order IDs, types, statuses, and creation dates.
get-open-tickets care Support List all open support tickets for a customer account. Returns ticket number, subject, severity, creation date, and assigned team from SuiteCRM.
create-ticket care Support Create a new support ticket in SuiteCRM on behalf of a customer. Accepts subject, description, severity, and account ID. Write operation — requires confirmation.
get-customer-info care CRM Retrieve the full customer record including contact details, account status, assigned account manager, and service tier from SuiteCRM.
Write Operations Three tools perform write operations: place-a-new-order, pay-invoice, and create-ticket. The generated MCP server marks these with a requiresConfirmation: true flag. A well-configured AI agent will prompt the end user to confirm before executing these tools. Review your AI agent's tool-confirmation settings before deploying write-capable servers to production.

Tool-to-Adapter Mapping

Disabling all tools for a given adapter removes that adapter's generated files entirely. For example: if you enable only show-latest-bill and get-open-tickets, the factory generates only the billing adapter and the care adapter — no product or order files are created, and those BSS credentials are not required in .env.

06 — Data Mapping

Field Maps and Status Maps

BSS systems speak their own language. Your billing system calls a field nr; your AI agent should see invoiceNumber. The manifest's field and status maps handle this translation at generation time — not at runtime.

Field Maps

A field_map is a simple object where each key is a BSS API field name and each value is the clean, semantic name that will appear in the MCP tool response. The factory bakes this map directly into the generated TypeScript as a typed constant — there is no runtime lookup, no external configuration, and no performance overhead.

BSS API (raw)
nr
total
date_created
due_date
status
currency
field_map
AI Agent (semantic)
invoiceNumber
totalAmount
issueDate
dueDate
status
currency

In the generated TypeScript, the field map appears as a constant that the adapter applies to every API response before returning it to the MCP tool handler:

TypeScript — generated field map constant
// Auto-generated by Exosphere MCP Factory v1.0.0
// DO NOT EDIT — regenerate from manifest to update

export const INVOICE_FIELD_MAP: Record<string, string> = {
  nr:           'invoiceNumber',
  total:        'totalAmount',
  date_created: 'issueDate',
  due_date:     'dueDate',
  status:       'status',
  currency:     'currency',
};

export function applyFieldMap(
  raw: Record<string, unknown>,
  map: Record<string, string>
): Record<string, unknown> {
  const result: Record<string, unknown> = {};
  for (const [rawKey, rawVal] of Object.entries(raw)) {
    const mappedKey = map[rawKey] ?? rawKey;
    result[mappedKey] = rawVal;
  }
  return result;
}

Status Maps

A status_map translates BSS-internal status codes into semantic values that an AI agent can reason about and communicate naturally to an end user. BSS systems often use terse or legacy status codes that are perfectly clear to a billing engineer but ambiguous for an LLM generating a natural-language response.

BSS Status (raw)Semantic Status (mapped)Meaning
paid settled Invoice has been paid and is fully settled. No action required.
unpaid new Invoice is outstanding. Due date may be in the future or past.
refunded disputed Invoice has been refunded, typically after a billing dispute.
cancelled onHold Invoice has been cancelled. Likely requires customer service action.

Like field maps, the status map is baked into the generated TypeScript at factory time. The generated server does not call back to the factory at runtime — all mappings are static constants in the adapter file.

Custom Status Values You can use any string values you like on the right-hand side of the status map. The factory does not validate them. Common choices: settled, outstanding, overdue, disputed, waived, pending. Use whatever vocabulary makes the most sense for your AI agent's prompt design.
07 — API Reference

API Reference

The factory exposes a simple REST API. All endpoints except /health require HTTP Basic Auth. The UI is a wrapper around the same API — all operations can be performed programmatically.

GET /health Service status check. No auth required.

Returns the service health status. Use this endpoint for uptime monitors and load balancer health checks.

Response — 200 OK
{
  "status":  "ok",
  "service": "exosphere-mcp-factory",
  "version": "1.0.0"
}
GET /examples List available example manifests

Returns a list of available example manifests. Authentication required.

Response — 200 OK
[
  {
    "id":           "fossbilling-demo",
    "name":         "FOSSbilling Demo",
    "description":  "Caribbean telecoms, FOSSbilling + SuiteCRM",
    "toolCount":    6,
    "adapterCount": 3
  }
]
GET /examples/:id Retrieve a specific example manifest JSON

Returns the full JSON manifest for the specified example. Replace :id with an example ID from GET /examples. Returns 404 if the ID is not found. Authentication required.

Example: GET /examples/fossbilling-demo returns the complete FOSSbilling demo manifest JSON, ready to paste into the editor or pipe to POST /generate.

POST /generate Generate a complete MCP server package

The primary endpoint. Accepts a complete Estate Manifest JSON body and returns a generated MCP server package as a downloadable ZIP. Authentication required.

HeaderValue
Content-Typeapplication/json
AuthorizationBasic <base64(username:password)>
Response — 200 OK (success)
{
  "success":      true,
  "toolCount":    6,
  "adapterCount": 3,
  "fileCount":    11,
  "durationMs":   42,
  "files": [
    { "path": "src/index.ts",           "size": 2841 },
    { "path": "src/adapters/billing.ts", "size": 4312 },
    { "path": "src/adapters/product.ts", "size": 3218 },
    { "path": "src/adapters/care.ts",    "size": 3904 },
    { "path": "package.json",           "size":  712 },
    { "path": ".env.example",           "size":  248 },
    { "path": "Dockerfile",             "size":  580 },
    { "path": "README.md",              "size": 1640 }
  ],
  "downloadUrl": "/download/mcp-server-your-telecom-id.zip"
}
Response — 400 Bad Request (validation error)
{
  "error":   "Manifest validation failed",
  "details": [
    "manifest_version is required",
    "tools.enabled must contain at least one tool name"
  ]
}

Example: cURL

bash — generate via cURL
# Download the example manifest, pipe it straight to /generate, save as ZIP
curl -u "user:pass" https://factory.exos.bluenotelogic.com/examples/fossbilling-demo \
  | curl -u "user:pass" -X POST \
      -H "Content-Type: application/json" \
      -d @- \
      https://factory.exos.bluenotelogic.com/generate \
      -o mcp-server.zip

# Or generate from your own manifest file
curl -X POST https://factory.exos.bluenotelogic.com/generate \
  -u "user:pass" \
  -H "Content-Type: application/json" \
  -d @my-estate-manifest.json \
  -o mcp-server.zip
08 — Deployment

Deploying the Generated Server

The generated MCP server is a standard Node.js/TypeScript package. It runs anywhere Node.js runs: bare metal, VPS, Docker, or Kubernetes. Typical first deployment takes under 10 minutes.

Node.js Deployment

01
Extract the ZIP
Unzip the downloaded package: unzip mcp-server-your-telecom-id.zip -d ./my-mcp-server
02
Configure Environment Variables
Copy .env.example to .env and fill in your BSS API credentials. Every enabled adapter has a corresponding entry in the file.
03
Install Dependencies
Run npm install in the extracted directory. Node.js 18 or higher is required.
04
Start the MCP Server
Run npm start. The server starts on port 3000 by default. Override with PORT=8080 npm start.
05
Connect Your AI Agent
Configure your AI agent (Dify, Claude Desktop, Azure Copilot Studio, or any MCP-compatible client) to connect to http://your-host:3000. The server exposes the MCP tool registry at the root endpoint.

Docker Deployment

A Dockerfile is included in every generated package. It uses a Node.js 18 Alpine base image and produces a minimal production image.

bash — Docker build and run
# Build the image
docker build -t my-mcp-server .

# Run with env file
docker run -d \
  -p 3000:3000 \
  --env-file .env \
  --name my-mcp-server \
  my-mcp-server

# Check logs
docker logs -f my-mcp-server

# Health check
curl http://localhost:3000/health

AI Agent Integration

AI PlatformIntegration MethodNotes
Dify Custom Tool via HTTP endpoint Add the MCP server URL as a custom API tool. Provide the tool schema JSON from GET /tools on the running server.
Claude Desktop MCP Server config in claude_desktop_config.json Add the server URL under mcpServers. Claude will auto-discover all registered tools on connect.
Azure Copilot Studio Custom connector via OpenAPI spec The server exposes an OpenAPI-compatible spec at /openapi.json. Import this in Copilot Studio as a custom connector.
OpenAI Assistants Function calling via /tools schema Fetch the tool schema from GET /tools and register each tool as an OpenAI function definition in your assistant configuration.
LLM Quality Note The generated MCP server works with any AI agent. For best results — particularly for BSS reasoning tasks involving multiple tool calls or customer-facing responses — use GPT-4o (OpenAI or Azure OpenAI) as the LLM backbone. The current BNL development environment uses qwen3-14b-fast on local GPU hardware, which is adequate for internal testing but is not recommended for operator demos or production. First-token latency on the local GPU averages 4–6 seconds; complex reasoning chains occasionally fail. Contact Blue Note Logic to discuss LLM hosting options for production deployments.
09 — Troubleshooting

Troubleshooting

Most issues fall into three categories: manifest validation errors (before generation), deployment errors (after downloading the ZIP), and runtime connectivity errors (once the server is running). This section covers the most common cases in each category.

Factory Errors (During Generation)

Error / SymptomLikely CauseFix
400: manifest_version required Top-level manifest_version field is missing from the manifest JSON. Add "manifest_version": "1.0" as the first key in your manifest object.
400: unknown tool name A tool name in tools.enabled does not match any supported tool. Tool names are case-sensitive. Check Section 5 for the exact list of valid tool names. Names are lowercase, hyphen-delimited.
400: tools.enabled is empty The tools.enabled array is present but contains no entries. Add at least one valid tool name to the array.
400: unknown adapter type An adapter's type value is not one of the four supported types. Use one of: fossbilling, product-catalog, order-management, suitecrm.
401 Unauthorized HTTP Basic Auth credentials are incorrect or missing. Check your credentials with Blue Note Logic. Ensure username:password is correctly base64-encoded if calling via API.
400: no adapters defined The adapters object is empty, or no adapter has a matching tool in tools.enabled. Ensure at least one adapter is configured and at least one of its tools appears in tools.enabled.

Deployment Errors (Post-Generation)

Error / SymptomLikely CauseFix
Error: Cannot find module npm install was not run, or ran incompletely. Delete node_modules/ and run npm install again. Ensure Node.js 18+.
Server exits immediately on start A required environment variable from .env.example is missing in .env. Compare .env against .env.example. Fill in all blank values. The server validates required env vars on startup and exits with a descriptive error message.
TypeScript compile error A generated TypeScript file was hand-edited and contains a type error. Treat the manifest as the source of truth and regenerate rather than hand-editing. For custom modifications, use TypeScript strict mode.
Port 3000 already in use Another process is using port 3000 on the host. Start with a different port: PORT=8080 npm start, or set PORT=8080 in .env.

Runtime Errors (BSS Connectivity)

Error / SymptomLikely CauseFix
Tool returns "BSS auth failed" The API token or OAuth2 secret in .env is invalid or expired. Regenerate the API token in your BSS system and update the .env value. For SuiteCRM OAuth2, ensure the assigned_user_id is set on the OAuth2 client record.
Tool returns "BSS endpoint unreachable" The base_url in the manifest is incorrect, or the BSS system is unavailable. Verify the base_url by curling it from the MCP server host directly. Check firewall rules. If the URL needs to change, update the manifest and regenerate.
Field names missing in tool response The field_map in the manifest does not match the actual BSS API field names. Enable debug logging with DEBUG=1 npm start to inspect raw BSS API responses. Update the field_map in your manifest and regenerate.
AI agent not calling tools correctly The AI agent's LLM does not reliably follow tool-use instructions, or the LLM is too small for multi-step BSS workflows. Switch to GPT-4o or Claude Sonnet as the LLM backbone. Avoid models under 7B parameters for complex BSS workflows. Check that tool descriptions are enabled and not truncated in the agent's context window.
Support For issues not covered here, contact Blue Note Logic at dave@bluenotelogic.com. Include your manifest (redact credentials) and any error output from the factory response or server console. Include the durationMs from the generate response if you have it.