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
- Sign up at https://context.gnist.ai/signup for a free API key (100 calls/day).
- Choose your integration method: MCP protocol or REST API.
Connect via MCP
Add to your MCP client config (Claude Desktop, Cursor, etc.):
{
"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.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | required | |
top_n | integer | optional | (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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | required | |
tools | list[string] | required | |
description | string | optional | (default: ) |
validate | boolean | optional | (default: True) |
auto_complete | boolean | optional | (default: False) |
ttl_days | any | optional |
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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | 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": "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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | required | |
add_tools | any | optional | |
remove_tools | any | optional | |
validate | boolean | optional | (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.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | 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": "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.
| Parameter | Type | Required | Description |
|---|---|---|---|
tools | list[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'.
| Parameter | Type | Required | Description |
|---|---|---|---|
feedback | string | required | |
feedback_type | string | optional | (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
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.