GnistAI GnistAI
Log in

Getting Started with Compose

Create and manage toolbelts — curated subsets of tools served as single MCP endpoints.

All Tutorials   |   Overview   |   Playground   |   MCP   |   REST API   |   Home
Platform

Data source: Internal registry

Overview

Compose wraps Internal registry, handling authentication, pagination, and rate limits for you. This tutorial covers all 10 tools with working code examples you can copy and run.

Prerequisites

  1. Sign up at https://context.gnist.ai/signup for a free API key (100 calls/day).
  2. Choose your integration method: MCP protocol or REST API.

Connect via MCP

Add to your MCP client config (Claude Desktop, Cursor, etc.):

MCP Config
{
  "mcpServers": {
    "gnist-compose": {
      "url": "https://context.gnist.ai/mcp/compose/",
      "headers": {
        "Gnist-API-Key": "YOUR_API_KEY"
      }
    }
  }
}

Tools (10)

list_available_servers

List all registered Gnist Context MCP servers. Returns server name, mount path, tool count, description, and category for every upstream data server available for toolbelt composition. Returns: Dict with a "servers" list. Each entry has: - name: Display name (e.g. "GLEIF (LEI)") - mount_path: Server path (e.g. "/gleif") - tool_count: Number of tools in the server - description: What the server provides - category: Data category (e.g. "Finance", "Science")

curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "list_available_servers", "arguments": {}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {}, 'name': 'list_available_servers'}},
)
print(resp.json())

search_tools

Search all registered MCP tools by keyword or intent. Results include a colon-namespaced tool_ref (e.g. "gleif:search_entities") ready for use with create_toolbelt. Args: query: Natural language or keyword search. top_n: Max results (default 10, max 20). Returns: Dict with matching tools, each including tool_ref for toolbelt use.

ParameterTypeRequiredDescription
querystringrequired
top_nintegeroptional (default: 10)
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "search_tools", "arguments": {"query": "renewable energy"}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'query': 'renewable energy'}, 'name': 'search_tools'}},
)
print(resp.json())

create_toolbelt

Create a named toolbelt — a curated subset of tools served as one MCP endpoint. The toolbelt becomes available at /mcp/{name}/ as a standard MCP server containing only the selected tools, namespaced with colons. Args: name: URL-safe slug (3-64 chars, lowercase alphanum + hyphens). tools: Tool refs in colon format (e.g. ["gleif:search_entities", "news:search_news"]). Use search_tools to discover available refs. description: Optional human-readable description. validate: Check coupling dependencies (default true). auto_complete: Automatically add hard dependencies (default false). ttl_days: Auto-expire after N days. Null = no expiry. Returns: Created toolbelt with url, tool_count, warnings, and auto_added tools.

ParameterTypeRequiredDescription
namestringrequired
toolslist[string]required
descriptionstringoptional (default: )
validatebooleanoptional (default: True)
auto_completebooleanoptional (default: False)
ttl_daysanyoptional
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "create_toolbelt", "arguments": {"name": "example", "tools": ["example"]}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'name': 'example', 'tools': ['example']},
            'name': 'create_toolbelt'}},
)
print(resp.json())

list_toolbelts

List all saved toolbelts with name, url, tool count, and timestamps. Returns: Dict with count and toolbelts list.

curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "list_toolbelts", "arguments": {}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {}, 'name': 'list_toolbelts'}},
)
print(resp.json())

get_toolbelt

Get the full definition of a named toolbelt. Args: name: Toolbelt slug. Returns: Full toolbelt definition including tools, url, and coupling warnings.

ParameterTypeRequiredDescription
namestringrequired
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "get_toolbelt", "arguments": {"name": "example"}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'name': 'example'}, 'name': 'get_toolbelt'}},
)
print(resp.json())

update_toolbelt

Add or remove tools from an existing toolbelt. The URL stays stable. Args: name: Toolbelt slug. add_tools: Tool refs to add (colon format). remove_tools: Tool refs to remove. validate: Re-check coupling after changes (default true). Returns: Updated toolbelt definition, or error if not found.

ParameterTypeRequiredDescription
namestringrequired
add_toolsanyoptional
remove_toolsanyoptional
validatebooleanoptional (default: True)
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "update_toolbelt", "arguments": {"name": "example"}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'name': 'example'}, 'name': 'update_toolbelt'}},
)
print(resp.json())

delete_toolbelt

Soft-delete a toolbelt. The endpoint stops serving immediately. Args: name: Toolbelt slug to delete. Returns: Confirmation or error.

ParameterTypeRequiredDescription
namestringrequired
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "delete_toolbelt", "arguments": {"name": "example"}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'name': 'example'}, 'name': 'delete_toolbelt'}},
)
print(resp.json())

list_presets

List curated preset toolbelts — ready-to-use bundles for common use cases. Presets are pre-configured toolbelts covering domains like Norwegian data, financial research, academic research, business intelligence, and more. Each preset is immediately available as an MCP endpoint at /mcp/{name}/. Returns: Dict with count and presets list. Each entry has name, description, url, tool_count, and included servers.

curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "list_presets", "arguments": {}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {}, 'name': 'list_presets'}},
)
print(resp.json())

preview_toolbelt

Preview a toolbelt without saving. Estimates token cost and checks coupling. Use this to evaluate a tool selection before committing to create_toolbelt. Args: tools: Tool refs in colon format. Returns: Tool count, estimated schema tokens, coupling warnings, and suggestions.

ParameterTypeRequiredDescription
toolslist[string]required
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "preview_toolbelt", "arguments": {"tools": ["example"]}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'tools': ['example']}, 'name': 'preview_toolbelt'}},
)
print(resp.json())

report_feedback

Report a bug, feature request, or general feedback for this data source. Use this when something doesn't work as expected, when you'd like a new feature, or when you have suggestions for improvement. Args: feedback: Describe the issue or suggestion. feedback_type: One of 'bug', 'feature_request', or 'general'.

ParameterTypeRequiredDescription
feedbackstringrequired
feedback_typestringoptional (default: general)
curl -X POST "https://context.gnist.ai/mcp/compose/" \
  -H "Content-Type: application/json" \
  -H "Gnist-API-Key: YOUR_API_KEY" \
  -d '{"jsonrpc": "2.0", "method": "tools/call", "id": 1, "params": {"name": "report_feedback", "arguments": {"feedback": "example"}}}'
import httpx

resp = httpx.post(
    "https://context.gnist.ai/mcp/compose/",
    headers={"Gnist-API-Key": "YOUR_API_KEY"},
    json={'id': 1,
 'jsonrpc': '2.0',
 'method': 'tools/call',
 'params': {'arguments': {'feedback': 'example'}, 'name': 'report_feedback'}},
)
print(resp.json())

Common Patterns

Search then retrieve
Use list_available_servers to find items, then get_toolbelt to get full details. This two-step pattern is common for exploring data before drilling down.

FAQ

What data does Compose provide?

Create and manage toolbelts — curated subsets of tools served as single MCP endpoints. It exposes 10 tools: list_available_servers, search_tools, create_toolbelt, list_toolbelts, get_toolbelt, update_toolbelt, delete_toolbelt, list_presets, preview_toolbelt, report_feedback.

What do I need to get started?

A Gnist API key (free tier: 100 calls/day). Sign up at https://context.gnist.ai/signup.

What format does the Compose API return?

JSON, via either MCP protocol (JSON-RPC 2.0) or REST API.

Next Steps

Related Tutorials