{"openapi":"3.0.3","info":{"title":"Gnist Context — Compose","description":"Create and manage toolbelts — curated subsets of tools served as single MCP endpoints.\n\n- **MCP endpoint:** `https://context.gnist.ai/mcp/compose/`\n- **Toolkit page:** `/toolkits/compose`\n- **Full API spec:** `/api/openapi.json`\n- **Get an API key:** `/signup`","version":"1.0.0","contact":{"name":"GnistAI","url":"https://gnist.ai"}},"servers":[{"url":"https://context.gnist.ai","description":"Production"}],"paths":{"/rest/compose/list_available_servers":{"post":{"tags":["Platform"],"summary":"list_available_servers","description":"List all registered Gnist Context MCP servers.\n\nReturns server name, mount path, tool count, description, and category\nfor every upstream data server available for toolbelt composition.\n\nReturns:\n    Dict with a \"servers\" list. Each entry has:\n    - name: Display name (e.g. \"GLEIF (LEI)\")\n    - mount_path: Server path (e.g. \"/gleif\")\n    - tool_count: Number of tools in the server\n    - description: What the server provides\n    - category: Data category (e.g. \"Finance\", \"Science\")","operationId":"compose_list_available_servers","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}]}},"/rest/compose/search_tools":{"post":{"tags":["Platform"],"summary":"search_tools","description":"Search all registered MCP tools by keyword or intent.\n\nResults include a colon-namespaced tool_ref (e.g. \"gleif:search_entities\")\nready for use with create_toolbelt.\n\nArgs:\n    query: Natural language or keyword search.\n    top_n: Max results (default 10, max 20).\n\nReturns:\n    Dict with matching tools, each including tool_ref for toolbelt use.","operationId":"compose_search_tools","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"query":{"type":"string"},"top_n":{"default":10,"type":"integer"}},"required":["query"],"type":"object"}}}}}},"/rest/compose/create_toolbelt":{"post":{"tags":["Platform"],"summary":"create_toolbelt","description":"Create a named toolbelt — a curated subset of tools served as one MCP endpoint.\n\nThe toolbelt becomes available at /mcp/{name}/ as a standard MCP server\ncontaining only the selected tools, namespaced with colons.\n\nArgs:\n    name: URL-safe slug (3-64 chars, lowercase alphanum + hyphens).\n    tools: Tool refs in colon format (e.g. [\"gleif:search_entities\", \"news:search_news\"]).\n           Use search_tools to discover available refs.\n    description: Optional human-readable description.\n    validate: Check coupling dependencies (default true).\n    auto_complete: Automatically add hard dependencies (default false).\n    ttl_days: Auto-expire after N days. Null = no expiry.\n\nReturns:\n    Created toolbelt with url, tool_count, warnings, and auto_added tools.","operationId":"compose_create_toolbelt","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"type":"string"},"tools":{"items":{"type":"string"},"type":"array"},"description":{"default":"","type":"string"},"validate":{"default":true,"type":"boolean"},"auto_complete":{"default":false,"type":"boolean"},"ttl_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null}},"required":["name","tools"],"type":"object"}}}}}},"/rest/compose/list_toolbelts":{"post":{"tags":["Platform"],"summary":"list_toolbelts","description":"List all saved toolbelts with name, url, tool count, and timestamps.\n\nReturns:\n    Dict with count and toolbelts list.","operationId":"compose_list_toolbelts","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}]}},"/rest/compose/get_toolbelt":{"post":{"tags":["Platform"],"summary":"get_toolbelt","description":"Get the full definition of a named toolbelt.\n\nArgs:\n    name: Toolbelt slug.\n\nReturns:\n    Full toolbelt definition including tools, url, and coupling warnings.","operationId":"compose_get_toolbelt","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"}}}}}},"/rest/compose/update_toolbelt":{"post":{"tags":["Platform"],"summary":"update_toolbelt","description":"Add or remove tools from an existing toolbelt. The URL stays stable.\n\nArgs:\n    name: Toolbelt slug.\n    add_tools: Tool refs to add (colon format).\n    remove_tools: Tool refs to remove.\n    validate: Re-check coupling after changes (default true).\n\nReturns:\n    Updated toolbelt definition, or error if not found.","operationId":"compose_update_toolbelt","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"type":"string"},"add_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"remove_tools":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"default":null},"validate":{"default":true,"type":"boolean"}},"required":["name"],"type":"object"}}}}}},"/rest/compose/delete_toolbelt":{"post":{"tags":["Platform"],"summary":"delete_toolbelt","description":"Soft-delete a toolbelt. The endpoint stops serving immediately.\n\nArgs:\n    name: Toolbelt slug to delete.\n\nReturns:\n    Confirmation or error.","operationId":"compose_delete_toolbelt","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"name":{"type":"string"}},"required":["name"],"type":"object"}}}}}},"/rest/compose/list_presets":{"post":{"tags":["Platform"],"summary":"list_presets","description":"List curated preset toolbelts — ready-to-use bundles for common use cases.\n\nPresets are pre-configured toolbelts covering domains like Norwegian data,\nfinancial research, academic research, business intelligence, and more.\nEach preset is immediately available as an MCP endpoint at /mcp/{name}/.\n\nReturns:\n    Dict with count and presets list. Each entry has name, description,\n    url, tool_count, and included servers.","operationId":"compose_list_presets","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}]}},"/rest/compose/preview_toolbelt":{"post":{"tags":["Platform"],"summary":"preview_toolbelt","description":"Preview a toolbelt without saving. Estimates token cost and checks coupling.\n\nUse this to evaluate a tool selection before committing to create_toolbelt.\n\nArgs:\n    tools: Tool refs in colon format.\n\nReturns:\n    Tool count, estimated schema tokens, coupling warnings, and suggestions.","operationId":"compose_preview_toolbelt","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"tools":{"items":{"type":"string"},"type":"array"}},"required":["tools"],"type":"object"}}}}}},"/rest/compose/report_feedback":{"post":{"tags":["Platform"],"summary":"report_feedback","description":"Report a bug, feature request, or general feedback for this data source.\n\nUse this when something doesn't work as expected, when you'd like\na new feature, or when you have suggestions for improvement.\n\nArgs:\n    feedback: Describe the issue or suggestion.\n    feedback_type: One of 'bug', 'feature_request', or 'general'.","operationId":"compose_report_feedback","responses":{"200":{"description":"Successful tool call","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Server or tool not found"},"500":{"description":"Tool execution error"}},"security":[{"ApiKeyHeader":[]},{"ApiKeyQuery":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"feedback":{"type":"string"},"feedback_type":{"default":"general","type":"string"}},"required":["feedback"],"type":"object"}}}}}}},"tags":[{"name":"Platform","description":"Data sources: Platform"}],"components":{"securitySchemes":{"ApiKeyHeader":{"type":"apiKey","in":"header","name":"gnist-api-key","description":"API key passed via request header."},"ApiKeyQuery":{"type":"apiKey","in":"query","name":"gnist_api_key","description":"API key passed via query parameter."}}}}