curl --request POST \
--url https://api.globalwebindex.com/v2beta/spark-api/mcp \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_skills",
"arguments": {}
}
}
'import requests
url = "https://api.globalwebindex.com/v2beta/spark-api/mcp"
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_skills",
"arguments": {}
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {name: 'list_skills', arguments: {}}
})
};
fetch('https://api.globalwebindex.com/v2beta/spark-api/mcp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.globalwebindex.com/v2beta/spark-api/mcp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 1,
'method' => 'tools/call',
'params' => [
'name' => 'list_skills',
'arguments' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.globalwebindex.com/v2beta/spark-api/mcp"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.globalwebindex.com/v2beta/spark-api/mcp")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.globalwebindex.com/v2beta/spark-api/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"skills\":[{\"key\":\"audience-comparison\",\"description\":\"Read this skill when the user asks to compare audiences or groups, contrast X vs Y, compare an attached audience, or explain similarities and differences.\"},{\"key\":\"audience-investigation\",\"description\":\"Read this skill when the user asks who to target, what audience to target, which audience is most likely to do or buy something, or how to target advertising, sponsorships, campaigns, or sales opportunities.\"},{\"key\":\"gwi-dictionary\",\"description\":\"Read this skill when the user asks what a GWI term or metric means, including responses, universe, audience percentage, data point percentage, or index.\"},{\"key\":\"segment-requests\",\"description\":\"Read this skill when the user asks for segments, segmentations, available segments, audience groups, market groups, or analysis of segment groups around a topic, location, or category.\"}]}"
}
],
"structuredContent": {
"skills": [
{
"key": "audience-comparison",
"description": "Read this skill when the user asks to compare audiences or groups, contrast X vs Y, compare an attached audience, or explain similarities and differences."
},
{
"key": "audience-investigation",
"description": "Read this skill when the user asks who to target, what audience to target, which audience is most likely to do or buy something, or how to target advertising, sponsorships, campaigns, or sales opportunities."
},
{
"key": "gwi-dictionary",
"description": "Read this skill when the user asks what a GWI term or metric means, including responses, universe, audience percentage, data point percentage, or index."
},
{
"key": "segment-requests",
"description": "Read this skill when the user asks for segments, segmentations, available segments, audience groups, market groups, or analysis of segment groups around a topic, location, or category."
}
]
}
}
}Execute GWI MCP v2beta tool calls
JSON-RPC endpoint for the v2beta MCP profile. Supported tools:
- list_skills
- get_skills
- list_datasets
- explore_datasets
- global_filters
- explore_taxonomy
- search_audiences
- audience_generation
- generate_insights
- explore_insight
curl --request POST \
--url https://api.globalwebindex.com/v2beta/spark-api/mcp \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_skills",
"arguments": {}
}
}
'import requests
url = "https://api.globalwebindex.com/v2beta/spark-api/mcp"
payload = {
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_skills",
"arguments": {}
}
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {name: 'list_skills', arguments: {}}
})
};
fetch('https://api.globalwebindex.com/v2beta/spark-api/mcp', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.globalwebindex.com/v2beta/spark-api/mcp",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'id' => 1,
'method' => 'tools/call',
'params' => [
'name' => 'list_skills',
'arguments' => [
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.globalwebindex.com/v2beta/spark-api/mcp"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.globalwebindex.com/v2beta/spark-api/mcp")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.globalwebindex.com/v2beta/spark-api/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"id\": 1,\n \"method\": \"tools/call\",\n \"params\": {\n \"name\": \"list_skills\",\n \"arguments\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "{\"skills\":[{\"key\":\"audience-comparison\",\"description\":\"Read this skill when the user asks to compare audiences or groups, contrast X vs Y, compare an attached audience, or explain similarities and differences.\"},{\"key\":\"audience-investigation\",\"description\":\"Read this skill when the user asks who to target, what audience to target, which audience is most likely to do or buy something, or how to target advertising, sponsorships, campaigns, or sales opportunities.\"},{\"key\":\"gwi-dictionary\",\"description\":\"Read this skill when the user asks what a GWI term or metric means, including responses, universe, audience percentage, data point percentage, or index.\"},{\"key\":\"segment-requests\",\"description\":\"Read this skill when the user asks for segments, segmentations, available segments, audience groups, market groups, or analysis of segment groups around a topic, location, or category.\"}]}"
}
],
"structuredContent": {
"skills": [
{
"key": "audience-comparison",
"description": "Read this skill when the user asks to compare audiences or groups, contrast X vs Y, compare an attached audience, or explain similarities and differences."
},
{
"key": "audience-investigation",
"description": "Read this skill when the user asks who to target, what audience to target, which audience is most likely to do or buy something, or how to target advertising, sponsorships, campaigns, or sales opportunities."
},
{
"key": "gwi-dictionary",
"description": "Read this skill when the user asks what a GWI term or metric means, including responses, universe, audience percentage, data point percentage, or index."
},
{
"key": "segment-requests",
"description": "Read this skill when the user asks for segments, segmentations, available segments, audience groups, market groups, or analysis of segment groups around a topic, location, or category."
}
]
}
}
}Authorizations
Format: Bearer YOUR_TOKEN
Body
JSON-RPC request for any supported v2beta MCP tool
- list_skills
- get_skills
- list_datasets
- explore_datasets
- global_filters
- explore_taxonomy
- search_audiences
- audience_generation
- generate_insights
- explore_insight
Discover workflow skill keys and short descriptions. Call at the start of each new GWI analysis and when the user shifts to a different workflow type on a follow-up.
Match the user request to returned descriptions. Do not invent keys. Full skill bodies are not included — use get_skills for matching keys only.
Do not mention this tool or skill mechanics in user-facing replies.
Response
JSON-RPC response. HTTP 200 means the JSON-RPC call was processed, not that the tool succeeded.
Inspect result.isError if present:
true— tool failed; the message is inresult.content[0].text, andresult._meta.isInternalErrormay betruefor internal or timeout-style failures.
See Tool errors (result.isError) in the overview above for full behavior.
JSON-RPC 2.0 success envelope for MCP tools/call (no top-level error field).
When the tool fails, HTTP status is still typically 200 and this object is returned with result.isError: true. Use that flag rather than HTTP status alone.
2.0 Request identifier echoed back
MCP tool result. Inspect isError for tool-level success or failure.
isError: true — the tool failed; content usually has one text item with a human-readable explanation. Typical causes:
- Invalid arguments (e.g. empty
prompt, invalid UUID forinsight_idwhere required). - Downstream errors (e.g. resource not found, timeout, cancelled request, or generic internal failure).
_meta.isInternalError — when present and true, the server classified the failure as internal or timeout-style. Omitted or false for most validation and not-found style errors.
This is not the same as a JSON-RPC protocol error: invalid method or malformed requests use the standard JSON-RPC error field instead of a tool result.
Show child attributes
Show child attributes
Was this page helpful?

