Skip to main content
Glama
DeJo90

nace-mcp

by DeJo90

nace-mcp

An MCP server exposing NACE Rev. 2.1 economic activity classification codes for AI agents.

NACE (Nomenclature of Economic Activities) is the European standard for classifying economic activities. This server loads all 1,047 codes into memory at startup and provides four tools for browsing, looking up, searching, and fuzzy-matching codes — without ever dumping the full dataset to the agent.

MCP Configuration

Add to your Claude (or any MCP-compatible client) config:

{
  "mcpServers": {
    "nace-mcp": {
      "command": "npx",
      "args": ["nace-mcp"]
    }
  }
}

Related MCP server: filed-mcp-server

Tools

nace_get(code)

Returns full details for a single NACE code.

Input: code — e.g. "A", "01", "25.1", "25.11"

Example output:

{
  "code": "95.31",
  "label": "Repair and maintenance of motor vehicles",
  "level": "class",
  "parent": "95.3"
}

nace_browse(parent_code?)

Returns the direct children of a code (compact: code + label only). Omit parent_code to list all 22 top-level sections. Max 50 results.

Input: parent_code (optional) — e.g. "C", "25", "25.1"

Example — nace_browse() (no argument):

[
  { "code": "A", "label": "Agriculture, forestry and fishing" },
  { "code": "B", "label": "Mining and quarrying" },
  { "code": "C", "label": "Manufacturing" },
  ...
]

Example — nace_browse("J"):

[
  { "code": "58", "label": "Publishing activities" },
  { "code": "59", "label": "Motion picture, video and television programme production, sound recording and music publishing activities" },
  { "code": "60", "label": "Programming, broadcasting, news agency and other content distribution activities" },
  ...
]

nace_search(query)

Case-insensitive substring search across all activity labels. Returns up to 10 matches.

Input: query — e.g. "software", "fishing", "consulting"

Example — nace_search("software"):

[
  { "code": "58.1", "label": "Publishing of books, newspapers and other publishing activities, except software publishing", "level": "group" },
  { "code": "58.19", "label": "Other publishing activities, except software publishing", "level": "class" },
  { "code": "58.2", "label": "Software publishing", "level": "group" },
  { "code": "58.29", "label": "Other software publishing", "level": "class" }
]

nace_suggest(activity_description)

Fuzzy-matches a free-text description to NACE codes. Tokenizes the input, scores by matched terms, and returns the top 5 candidates with a brief explanation. Designed for AI agents doing classification.

Input: activity_description — free-text description of the economic activity

Example — nace_suggest("computer programming software development consultancy"):

[
  {
    "code": "62",
    "label": "Computer programming, consultancy and related activities",
    "level": "division",
    "reason": "Matched: \"computer\", \"programming\", \"consultancy\""
  },
  {
    "code": "62.1",
    "label": "Computer programming activities",
    "level": "group",
    "reason": "Matched: \"computer\", \"programming\""
  },
  {
    "code": "62.10",
    "label": "Computer programming activities",
    "level": "class",
    "reason": "Matched: \"computer\", \"programming\""
  },
  ...
]

Tip: For non-English descriptions (e.g. German "KFZ Mechaniker"), rephrase in English before calling nace_suggest.


Prompt Examples

These examples show how an AI agent uses the tools in practice.


"What NACE code applies to a car repair shop?"

The agent calls nace_suggest with an English description:

nace_suggest("motor vehicle repair maintenance workshop")
[
  {
    "code": "95",
    "label": "Repair and maintenance of computers, personal and household goods, and motor vehicles and motorcycles",
    "level": "division",
    "reason": "Matched: \"motor\", \"vehicle\", \"repair\", \"maintenance\""
  },
  {
    "code": "95.3",
    "label": "Repair and maintenance of motor vehicles and motorcycles",
    "level": "group",
    "reason": "Matched: \"motor\", \"vehicle\", \"repair\", \"maintenance\""
  },
  {
    "code": "95.31",
    "label": "Repair and maintenance of motor vehicles",
    "level": "class",
    "reason": "Matched: \"motor\", \"vehicle\", \"repair\", \"maintenance\""
  }
]

The agent then drills into the best match with nace_get("95.31") to confirm the parent chain:

{
  "code": "95.31",
  "label": "Repair and maintenance of motor vehicles",
  "level": "class",
  "parent": "95.3"
}

Result: 95.31 is the correct class-level code for a car repair shop.


"What NACE code covers a bakery?"

nace_suggest("bakery bread pastry production")
[
  {
    "code": "10.71",
    "label": "Manufacture of bread; manufacture of fresh pastry goods and cakes",
    "level": "class",
    "reason": "Matched: \"bread\", \"pastry\""
  }
]

Result: 10.71 — first candidate is an exact match, no further navigation needed.


"Explore the information & communication sector"

The agent browses the hierarchy top-down:

nace_browse("J")
[
  { "code": "58", "label": "Publishing activities" },
  { "code": "59", "label": "Motion picture, video and television programme production, sound recording and music publishing activities" },
  { "code": "60", "label": "Programming, broadcasting, news agency and other content distribution activities" },
  { "code": "61", "label": "Telecommunications" },
  { "code": "62", "label": "Computer programming, consultancy and related activities" },
  { "code": "63", "label": "Information service activities" }
]

Then zooms into division 62:

nace_browse("62")
[
  { "code": "62.1", "label": "Computer programming activities" },
  { "code": "62.2", "label": "Computer consultancy and computer facilities management activities" },
  { "code": "62.3", "label": "Computer facilities management activities" },
  { "code": "62.9", "label": "Other information technology and computer service activities" }
]

Data

  • Source: jnsprnw/nace-codes — community-maintained JSON conversion of the official Eurostat NACE Rev. 2.1 classification

  • Coverage: 1,047 entries across 22 sections (A–U), 4 levels (section → division → group → class)

  • Authority: Eurostat NACE Rev. 2.1

Development

npm install
npm run build    # compile TypeScript → dist/
node dist/index.js  # run the server (listens on stdio)

To inspect with the MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Available Tools

4 tools
nace_browseA

Returns direct children of a NACE code (code + label only). Omit parent_code to get all 22 top-level sections. Max 50 results.

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_codeNoParent NACE code. Omit to list top-level sections.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description carries full burden and excellently discloses key behaviors: results are limited to 'direct children' (non-recursive), return fields are restricted to 'code + label only', and results are capped at 'Max 50'. These are critical runtime traits an agent needs to know.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary purpose, and every sentence delivers distinct information: functionality, response scope, optional behavior, and result limit. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-optional-parameter tool with no output schema, the description sufficiently covers all necessary context: what is returned (code+label), how to get top-level sections, the result cap, and the non-recursive nature. An agent has enough information to invoke correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% since the parameter's description ('Parent NACE code. Omit to list top-level sections.') already explains core semantics. The tool description adds the 'direct children' detail, but that is more about output behavior than parameter syntax, so the description adds minimal value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Returns direct children of a NACE code', with a specific scope ('code + label only'). This distinguishes it from sibling tools like nace_get (single item), nace_search (query matching), and nace_suggest (autocomplete) by explicitly framing it as a tree-browsing operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear usage context: 'Omit parent_code to get all 22 top-level sections' and 'Max 50 results' gives a constraint. However, it does not explicitly mention alternatives or when to prefer this tool over siblings, leaving some room for the agent to infer the browse-vs-search/get distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nace_getA

Returns full details for a single NACE Rev. 2.1 code: code, label, level (section/division/group/class), and parent code.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesNACE code — e.g. 'A', '01', '01.1', '01.11'

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does disclose the return fields (code, label, level, parent code), which is helpful, but it does not mention error cases, edge behavior (e.g., invalid code), or any side effects—though this is likely a read-only operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, well-structured sentence that front-loads the main purpose and necessary output details. No wasted words or redundant information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter lookup tool with no output schema, the description is largely complete: it states the purpose and enumerates the returned fields. Minor gaps include no mention of error behavior or formatting, but these are not critical for typical use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with the single parameter 'code' documented and given examples. The description itself does not add parameter-level detail, so it meets the baseline but provides no additional semantic value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Returns full details') and identifies the resource ('a single NACE Rev. 2.1 code'), clearly distinguishing it from sibling tools like browse, search, and suggest by emphasizing 'single' code retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly implies this tool is for fetching details of a known, single NACE code, contrasting with broader operations like browse or search. However, it does not explicitly name alternatives or state when not to use it, so it falls just short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

nace_suggestA

Fuzzy-match a free-text activity description to NACE Rev. 2.1 codes. Tokenizes the input, scores by matched terms, and returns the top 5 candidates with a reason. Ideal for AI agents classifying business activities.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_descriptionYesFree-text description of the economic activity to classify

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It explains the internal process (tokenizes, scores by matched terms) and the output behavior (returns top 5 with a reason), which is transparent about how results are generated. It does not detail edge cases like zero matches or partial matches, but the provided context is sufficient for a simple read-like tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, each earning its place: the first defines the core function, the second details the method, and the third gives the use case. No fluff, no unnecessary repetition, and it is front-loaded with the primary action.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with no output schema, the description covers the essential aspects: what it does, how it works, and when to use it. It mentions the output shape (top 5 with reason) which is sufficient. Missing only minor details like behavior with ambiguous/empty input, but overall it is complete for its complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage for the single parameter 'activity_description', already describing it as a free-text description. The tool description merely echoes 'free-text activity description' without adding new semantics, so it provides no value beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fuzzy-match') and resource ('free-text activity description to NACE Rev. 2.1 codes'), clearly distinguishing it from sibling tools like nace_search (likely exact/match-oriented) and nace_browse (hierarchical). It states the output (top 5 candidates with reason), making the tool's function unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Ideal for AI agents classifying business activities' provides clear context for when to use this tool. However, it does not explicitly mention alternatives or exclusions (e.g., 'use nace_search for exact code lookup'), so it lacks the direct comparison that would earn a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv1.0.1
    • First observednace_browse
    • First observednace_get
    • First observednace_search
    • First observednace_suggest

TDQS

A4.4/5.0
Disambiguation5/5

Each tool serves a distinct purpose: exact code lookup, hierarchical browsing, substring search, and fuzzy matching for classification. There is no overlap in functionality, and the descriptions clearly differentiate them.

Naming Consistency5/5

All tools follow a consistent 'nace_<verb>' pattern (get, browse, search, suggest). This is a uniform and predictable naming convention.

Tool Count5/5

With 4 tools, the server is well-scoped for its purpose. Each tool covers a necessary operation for working with NACE codes, and there is no bloat or redundancy.

Completeness5/5

The tool set covers the entire workflow: retrieving details, navigating the hierarchy, searching by text, and classifying free-text descriptions. No major functional gaps exist for a NACE classification lookup and browsing service.

Maintenance

ActivityInactive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    MCP server for Slovak business registers (RPO) — AI agents can query 1.4M+ Slovak legal entities via Slovakia's official Statistical Office API. Search companies by name, IČO, or get full entity details including legal form, address, and statutory representatives.
    2
    1
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    An MCP server that gives AI agents access to US business entity data, enabling searches across 9 state registries, SEC EDGAR filings, federal contracts, and lobbying disclosures.
    6
    1
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/DeJo90/nace-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server