CPG Knowledge Graph

The MCP for the beauty, cosmetics and personal care sector

Should I use this

Quality & Safety

B
Description quality
89%
Schema completeness
79%
Naming quality
93%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (5)

  • HIGHTool poisoning patterns detected
  • LOWTool 'get_signal_chain' description lacks action verbin get_signal_chain
  • LOWTool 'count_gtin_coverage' description lacks action verbin count_gtin_coverage
  • LOWTool 'list_brands_by_node' description lacks action verbin list_brands_by_node
  • INFOTool description contains placeholder or incomplete textin resolve_sparks

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,490Tokens (tool definitions)
~1.0 KBTypical response size
Moderate attention impact (1.95% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "cpg-knowledge-graph": {
      "url": "https://mcp.cpgknowledgegraph.ai/mcp"
    }
  }
}

Remote endpoints

https://mcp.cpgknowledgegraph.ai/mcpstreamable-http

What it can do

Tool inventory

Tools (14)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟒resolve_gtin(gtin)

Resolve a GTIN to its procurement readiness signal. Zero-pads input to 14 digits.

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "description": "GS1 GTIN of the product, 8 to 14 digits; zero-padded to the canonical 14-digit GTIN-14 before lookup (e.g. 00990832300624).",
      "type": "string"
    }
  },
  "required": [
    "gtin"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒check_eligibility(gtin, banner, country_iso)

Check whether a GTIN can ship to a specific retailer banner in a country.

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "description": "GS1 GTIN of the product, 8 to 14 digits; zero-padded to the canonical 14-digit GTIN-14 before lookup (e.g. 00990832300624).",
      "type": "string"
    },
    "banner": {
      "description": "Retail banner name exactly as registered in the graph (the retailer_name returned by find_retailers).",
      "type": "string"
    },
    "country_iso": {
      "description": "ISO 3166-1 alpha-2 code of the selling market (e.g. FR), case-insensitive.",
      "type": "string"
    }
  },
  "required": [
    "gtin",
    "banner",
    "country_iso"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒get_signal_chain(gtin)

Return the full ACM-68000 signal chain for a GTIN (zero-pads to 14).

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "description": "GS1 GTIN of the product, 8 to 14 digits; zero-padded to the canonical 14-digit GTIN-14 before lookup (e.g. 00990832300624).",
      "type": "string"
    }
  },
  "required": [
    "gtin"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒count_gtin_coverage

Global coverage statistics: GTINs, nodes, makers (supply), retailers (demand).

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒resolve_scope(scope_id)

GSC Scoped Agents Registry β€” Era 1 founding registry (1,000,000 standing) plus Era 2 station-keyed registry (1,000,000 capacity, mint-on-activation) under SM-ECO-10060.

Input Schema

{
  "type": "object",
  "properties": {
    "scope_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Scoped agent id to resolve: Era 1 sa-{parent}-{jurisdiction}-m{mcp}-{seq} or Era 2 sa2-{namespace}-m{mcp}-d{station}-w{seq}. Omit for the registry summary."
    }
  }
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒list_nodes

The 49 sovereign nodes (the spine) β€” each with its GS1 GTIN and CLEAN per-node maker (supply) and retailer (demand) counts (separate subqueries, never summed).

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒resolve_node(code)

Resolve one node: its GS1 license + its makers (supply) + its retailers (demand). The market-picture call for a jurisdiction; use this first for 'what does the market look like in X'.

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes.",
      "type": "string"
    }
  },
  "required": [
    "code"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒find_makers(segment, region, node, has_website, limit)

Global cross-node maker (supply) search. Filter by segment / region / node / has_website.

Input Schema

{
  "type": "object",
  "properties": {
    "segment": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Maker segment label as stored on the registry row (e.g. Haircare, Skincare); exact match. Omit for all segments."
    },
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Region label as stored on the registry row (e.g. EU, ASIA), case-insensitive. Omit for all regions."
    },
    "node": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes. Omit for all nodes."
    },
    "has_website": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "true = only makers with a website on record; false = only makers without one; omit for both."
    },
    "limit": {
      "default": 25,
      "description": "Maximum rows to return, 1 to 500 (default 25).",
      "type": "integer"
    }
  }
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒find_retailers(region, node, parent_banner, limit)

Global cross-node retailer (demand) search. Filter by region / node / parent_banner.

Input Schema

{
  "type": "object",
  "properties": {
    "region": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Region label as stored on the registry row (e.g. EU, ASIA), case-insensitive. Omit for all regions."
    },
    "node": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes. Omit for all nodes."
    },
    "parent_banner": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "default": null,
      "description": "Parent banner name, case-insensitive substring match (e.g. Carrefour). Omit for all banners."
    },
    "limit": {
      "default": 25,
      "description": "Maximum rows to return, 1 to 500 (default 25).",
      "type": "integer"
    }
  }
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒node_market(code)

Supply↔demand bridge for ONE jurisdiction: makers (supply) and retailers (demand) as two separate counts (never summed), plus the same-node potential bridge pairs. The market-picture call for a jurisdiction; use this first for 'what does the market look like in X'.

Input Schema

{
  "type": "object",
  "properties": {
    "code": {
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes.",
      "type": "string"
    }
  },
  "required": [
    "code"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒list_sku_types

SPARKS taxonomy: the 84 standing BPC product-type codes the graph is structured on. Validate a type against this before a typed query. (BRAND is a tier, not a type.)

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒list_brands_by_node(node)

SPARKS depth surface: the distinct brands SPARKS covers in a sovereign market. Answers 'what brands do you know in [node]'. Coverage only β€” no pack/size values.

Input Schema

{
  "type": "object",
  "properties": {
    "node": {
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes.",
      "type": "string"
    }
  },
  "required": [
    "node"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒get_kernel(brand, node)

SPARKS completeness tier for a brand in a market: 100 = resolvable (a real pack/size record is held) . 8 = registered (brand known, pack/size pending) . 'floor' = STANDARD default (no brand-specific record). Returns the stored tier flag β€” do NOT compute a score. Never returns a pack/size.

Input Schema

{
  "type": "object",
  "properties": {
    "brand": {
      "description": "Brand name as marketed (e.g. Nivea); normalized exact match, fail-closed.",
      "type": "string"
    },
    "node": {
      "description": "Sovereign node code: the ISO 3166-1 alpha-2 code of the jurisdiction (e.g. FR, KR, AE), case-insensitive; list_nodes returns the 49 codes.",
      "type": "string"
    }
  },
  "required": [
    "brand",
    "node"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟒resolve_sparks(gtin)

Two-branch SPARKS resolver (zero-pads GTIN to 14). Branch A GSC Territory/License GTIN (990832300xxx) -> FULL license record (public). Branch B any third-party BPC GTIN -> GATED proof {recognized, region_node, kernel_available}; the pack/size VALUE is NEVER returned. Route to Navigator. Brand match is fail-closed (normalized exact match); uncertainty -> recognized:false.

Input Schema

{
  "type": "object",
  "properties": {
    "gtin": {
      "description": "GS1 GTIN of the product, 8 to 14 digits; zero-padded to the canonical 14-digit GTIN-14 before lookup (e.g. 00990832300624).",
      "type": "string"
    }
  },
  "required": [
    "gtin"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded14 tools
verifiedversion not recorded14 tools