Skip to main content

Model Context Protocol

Grünig-SignTronic Catalog MCP Server

A stateless, authless, read-only Model Context Protocol server that exposes the public Grünig-SignTronic screen-printing catalog — products, jobs, distributors, legal pages and news — to any MCP client or AI assistant, over one standard endpoint.

Setup

Connect a client

The server speaks the Model Context Protocol over Streamable HTTP at a single endpoint. There is no API key and no account — point a client at the URL and its tools appear.

MCP endpoint
https://mcp.grunig-signtronic.com/mcp
Streamable HTTPNo authenticationRead-only
1Recommended

Claude.ai connector

Add it as a custom connector in Claude.

  1. Open Settings → Connectors.
  2. Click Add custom connector.
  3. Paste the endpoint shown above; leave authentication empty.
  4. Save, enable it in a chat, then ask about the catalog.

Use the MCP endpoint shown above

2

ChatGPT

Add it as a custom connector in ChatGPT (Plus, Pro, Team or Enterprise).

  1. Open Settings → Connectors.
  2. Click Create and choose a custom (MCP) connector.
  3. Paste the endpoint shown above as the server URL; set authentication to none.
  4. Save, enable it in a chat, then ask about the catalog.

Use the MCP endpoint shown above

3

MCP Inspector

Inspect and call tools directly from a terminal.

  1. Run the command below.
  2. Choose the Streamable HTTP transport.
  3. Enter the endpoint and click Connect.
  4. Use List Tools / Call Tool to explore.
Run
npx @modelcontextprotocol/inspector

Or let your assistant set it up

Paste this into Claude, ChatGPT or any MCP-aware assistant to add the server and try it in one step:

Setup prompt
Add the remote MCP server "Grünig-SignTronic Catalog" at https://mcp.grunig-signtronic.com/mcp (Model Context Protocol over Streamable HTTP, no authentication) to my MCP client, then list its tools and run search_products with query "coating" to confirm it works.

Call a tool directly (curl)

Every request is a single JSON-RPC POST. This searches the product catalog:

Search products
curl -s https://mcp.grunig-signtronic.com/mcp -H 'content-type: application/json' -H 'accept: application/json, text/event-stream' -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_products","arguments":{"query":"coating","lang":"en"}}}'

Reference

Tools

Every entity follows a uniform list / search + get shape: list and search tools return compact summaries, get_* tools return full detail. All tools are read-only, and every tool except ping takes a lang of “en”, “de”, “fr”, “it”, “es” or “pt”. This reference is generated from the server's own tool definitions, so it always matches what the endpoint exposes.

ping

Ping

Liveness check — returns 'pong' and the active environment. Takes no arguments.

Returns: A short text string, e.g. pong (production).

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "ping",
    "arguments": {}
  }
}

search_products

Search products

Search or list active Grünig-SignTronic products in the requested language. With `query`, it is a case-insensitive substring matched across all product text — name, short and full description, features, benefits, applications and specifications — so model numbers and technical terms (e.g. "1270", "UV-LED") match too. WITHOUT `query` it lists instead of searching, so `{ lang, category }` alone answers "which products are in this category" and `{ lang }` alone lists the catalog. `category` accepts a slug OR a category name in any of the catalog languages (see list_categories). Returns compact summaries (slug, name, short description, category, canonical URL) plus `total`, the number of matches before `limit` — raise `limit` when `count < total`; use get_product for full detail.

ParameterTypeReq.Description
querystring (1–200)optionalCase-insensitive search term. Omit to list instead of search.
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.
limitinteger (1–50)optionalMax results. Default 10.
categorystring (≤100)optionalCategory slug, or category name in any of the catalog languages (see list_categories).

Returns: { count, results: [{ slug, name, shortDescription, category, url }] }.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_products",
    "arguments": {
      "lang": "en",
      "category": "screen-preparation"
    }
  }
}

get_product

Get product

Return the full detail of a single active product in the requested language: descriptions, features, benefits, applications, specifications, documents and related-product slugs. Resolved by `slug`, `id` or `name` — pass `name` when you only know the display name ("G-COAT 746"); all three ignore case and `name` also matches as a substring. If nothing matches, the answer carries `suggestions` with the closest real products, so retry with one of those rather than guessing.

ParameterTypeReq.Description
slugstring (≤200)optionalProduct slug. Provide slug, id or name.
idstring (≤100)optionalProduct id. Provide slug, id or name.
namestring (≤200)optionalProduct display name; case-insensitive, substring allowed.
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.

Returns: { found, truncated, product } — truncated: true means a field hit the length cap. found: false (plus suggestions) if unknown or inactive.

At least one of slug, id or name is required.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_product",
    "arguments": {
      "name": "G-COAT 746",
      "lang": "en"
    }
  }
}

list_categories

List categories

List all active product categories in the requested language (slug, name, description, productCount). `productCount` is the number of active products in the category, so this is a map of the catalog — start here, then pass a slug or name as search_products' `category` to list that category's products.

ParameterTypeReq.Description
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.
limitinteger (1–200)optionalMax results. Default 50.

Returns: { count, results: [{ slug, name, description, productCount }] }.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_categories",
    "arguments": {
      "lang": "en"
    }
  }
}

list_jobs

List jobs

List open job postings as compact summaries in the requested language. Optionally filter by job type. Use get_job for full detail.

ParameterTypeReq.Description
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.
typestring (≤50)optionalJob type to filter by.
limitinteger (1–200)optionalMax results. Default 50.

Returns: { count, results: [{ slug, title, type, … }] }.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_jobs",
    "arguments": {
      "lang": "en"
    }
  }
}

get_job

Get job

Return the full detail of a single open job in the requested language: description, requirements, benefits and job type. Resolved by `slug`, `id` or `name` (the posting title) — all case-insensitive, `name` also as a substring. A miss carries `suggestions` with the open postings closest to what you asked for.

ParameterTypeReq.Description
slugstring (≤200)optionalJob slug. Provide slug, id or name.
idstring (≤100)optionalJob id. Provide slug, id or name.
namestring (≤200)optionalPosting title; case-insensitive, substring allowed.
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.

Returns: { found, truncated, job } — truncated: true means a field hit the length cap. found: false (plus suggestions) if unknown or closed.

At least one of slug, id or name is required.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_job",
    "arguments": {
      "name": "Automation Engineer",
      "lang": "en"
    }
  }
}

list_distributors

List distributors

List distributors as company-level summaries in the requested language (name, address, email, website, coordinates). Optionally filter by country. Person-level contact is NOT included here — use get_distributor.

ParameterTypeReq.Description
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.
countrystring (≤100)optionalCountry to filter by (case-insensitive).
limitinteger (1–200)optionalMax results. Default 50.

Returns: { count, results: [{ companyName, address, email, url, coordinates }] }.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_distributors",
    "arguments": {
      "lang": "en"
    }
  }
}

get_distributor

Get distributor

Return the full detail of a single distributor in the requested language — including the named contact person (email/phone/mobile), which is exposed only here and never in the bulk list. Resolved by `slug`, `id` or `name` (the company name) — all case-insensitive, `name` also as a substring. A miss carries `suggestions` with the closest partners.

ParameterTypeReq.Description
slugstring (≤200)optionalDistributor slug. Provide slug, id or name.
idstring (≤100)optionalDistributor id. Provide slug, id or name.
namestring (≤200)optionalCompany name; case-insensitive, substring allowed.
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.

Returns: { found, truncated, distributor } including a contact object; truncated: true means a field hit the length cap.

At least one of slug, id or name is required.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_distributor",
    "arguments": {
      "name": "Example Graphics",
      "lang": "en"
    }
  }
}

list_news

List news

List the latest news items in the requested language (title, excerpt, tags, date). Optionally filter by tag. Only excerpts are exposed — never full article HTML.

ParameterTypeReq.Description
lang"en" | "de" | "fr" | "it" | "es" | "pt"requiredResponse language for the catalog content.
tagstring (≤100)optionalTag to filter by.
limitinteger (1–50)optionalMax results. Default 10.

Returns: { count, results: [{ title, excerpt, tags, publishedAt }] }.

Example call
Example call
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_news",
    "arguments": {
      "lang": "en"
    }
  }
}

Every tool also declares an outputSchema and returns its payload twice — as structuredContent (real JSON, validated on every call) and as a readable JSON text block.

Beyond tools

Resources & prompts

The server advertises four capabilities: tools, resources, prompts and completions. Resources make the same catalog addressable by URI, so a client can attach and re-read a document without choosing a tool. Prompts are ready-made templates that compose the tools above.

Resources

Discover them via resources/list (concrete URIs) and resources/templates/list (patterns). {lang} is one of “en”, “de”, “fr”, “it”, “es” or “pt” — language is part of the address because every catalog record is localized. Resources return the full record, not the tools' summaries.

URIContents
catalog://{lang}/products{ count, products } — every active product, full detail
catalog://{lang}/products/{slug}One active product, full detail
catalog://{lang}/legal/{page}{ page, urlSlug, lang, summary, body, truncated }
catalog://{lang}/news{ count, news } — published news, excerpts only

Prompts

Each prompt composes the tools above; the lang argument autocompletes, which is what the completions capability is for. No prompt asks for a slug — products and categories go in as free text and the model resolves them itself via search_products. Optional arguments are optional on purpose, so a client form never blocks on an input.

PromptArgumentsPurpose
explore_cataloginterest?, lang?Orientation: categories with product counts, then where to go next
category_overviewcategory?, lang?The products of one category — the category name is enough
find_machineapplication, lang?Equipment recommendation for a described production need
compare_productsproducts?, criteria?, lang?Side-by-side comparison over the fields that differ
plan_screen_making_linerequirements, lang?A complete line as an ordered workflow, stage by stage
product_documentsproduct, lang?The datasheets and manuals published for a product
find_distributorcountry, lang?The sales partner covering a country, plus its contact
request_quoteneed, country?, lang?Quote request: shortlist, responsible partner, contact route
news_digesttopic?, lang?The latest published news, summarized from its excerpts
open_positionsinterest?, lang?Open job postings and what they involve

About

About this server

Purpose

It lets MCP clients and AI assistants query the public Grünig-SignTronic catalog through one standard, well-known endpoint — no scraping, no bespoke API.

Data source

All content originates from the public Grünig-SignTronic website and is served read-only. The catalog is refreshed whenever the website publishes; the server never writes.

Security

The endpoint is authless, read-only and stateless. It exposes no secrets, no writes and no personal data beyond what is already public on the website.

Transport

Model Context Protocol over Streamable HTTP. Requests are plain JSON-RPC over POST; responses are edge-cached where safe.