curl -sS \
-X POST \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{}' \
'https://api.0xinsider.com/api/v1/mcp'import requests
url = "https://api.0xinsider.com/api/v1/mcp"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.0xinsider.com/api/v1/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.0xinsider.com/api/v1/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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.0xinsider.com/api/v1/mcp"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.0xinsider.com/api/v1/mcp")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"_meta": {
"com.oxinsider/docs-group": "traders"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Get Trader Leaderboard"
},
"description": "Get the top-ranked prediction market traders (grades S, A, B only). Sorted by composite score descending. Supports cursor pagination and optional filters.\n\nArgs:\n - limit (number, 1-100, default 20): Max results per page\n - cursor (string, optional): Pagination cursor from previous response\n - category (string, optional): Filter by category slug\n - strategy (string, optional): Filter by strategy type\n\nReturns: Ranked list of traders with grade, score, P&L, volume, win rate, and strategy.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"description": "Filter by category slug",
"type": "string"
},
"cursor": {
"description": "Pagination cursor from previous response",
"type": "string"
},
"limit": {
"default": 20,
"description": "Max results (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"strategy": {
"description": "Filter by strategy type",
"type": "string"
}
},
"type": "object"
},
"name": "get_leaderboard",
"title": "Get Trader Leaderboard"
},
{
"_meta": {
"com.oxinsider/docs-group": "traders"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Get trader"
},
"description": "Look up a prediction market trader by wallet address or username. Returns grade (S through F), P&L breakdown, win rate, and volume.\n\nOptional expand fields for heavier data:\n- strategy: Trading strategy classification\n- categories: Per-category performance breakdown\n- quant_metrics: curated advanced metrics (copy_score and smart_score 0-100, sharpe_30d, sharpe_7d, profit_factor, edge_consistency, sharpe_percentile, pf_percentile, consistency_percentile); emitted only for a computed row strictly under six hours old, otherwise omitted; each present value is a number or null\n- trust: Per-field provenance (source, freshness, reconciliation, completeness) for grade, P&L, and stats\n\nUnknown addresses or usernames return sync_status \"unknown\" (not an error).\n\nArgs:\n - address (string, required): Ethereum wallet address (0x...) or trader username\n - expand (string[], optional): Heavy fields to include: \"strategy\", \"categories\", \"quant_metrics\", \"trust\"\n\nReturns: Trader profile with grade, P&L, stats, and optional expanded fields.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"address": {
"description": "Ethereum wallet address (0x...) or trader username",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"expand": {
"description": "Optional heavy fields to include",
"items": {
"enum": [
"strategy",
"categories"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"address"
],
"type": "object"
},
"name": "get_trader",
"title": "Get trader"
}
]
}
}{
"jsonrpc": "2.0",
"error": {
"code": 123,
"message": "<string>",
"data": {}
},
"id": "<string>"
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}Remote MCP
Call 0xinsider’s 44 read-only MCP tools over JSON-RPC from a hosted agent, with no process to install.
curl -sS \
-X POST \
-H "Authorization: Bearer $OXINSIDER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{}' \
'https://api.0xinsider.com/api/v1/mcp'import requests
url = "https://api.0xinsider.com/api/v1/mcp"
payload = {}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({})
};
fetch('https://api.0xinsider.com/api/v1/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.0xinsider.com/api/v1/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([
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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.0xinsider.com/api/v1/mcp"
payload := strings.NewReader("{}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.0xinsider.com/api/v1/mcp")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.0xinsider.com/api/v1/mcp")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
{
"_meta": {
"com.oxinsider/docs-group": "traders"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Get Trader Leaderboard"
},
"description": "Get the top-ranked prediction market traders (grades S, A, B only). Sorted by composite score descending. Supports cursor pagination and optional filters.\n\nArgs:\n - limit (number, 1-100, default 20): Max results per page\n - cursor (string, optional): Pagination cursor from previous response\n - category (string, optional): Filter by category slug\n - strategy (string, optional): Filter by strategy type\n\nReturns: Ranked list of traders with grade, score, P&L, volume, win rate, and strategy.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"category": {
"description": "Filter by category slug",
"type": "string"
},
"cursor": {
"description": "Pagination cursor from previous response",
"type": "string"
},
"limit": {
"default": 20,
"description": "Max results (1-100, default 20)",
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"strategy": {
"description": "Filter by strategy type",
"type": "string"
}
},
"type": "object"
},
"name": "get_leaderboard",
"title": "Get Trader Leaderboard"
},
{
"_meta": {
"com.oxinsider/docs-group": "traders"
},
"annotations": {
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false,
"readOnlyHint": true,
"title": "Get trader"
},
"description": "Look up a prediction market trader by wallet address or username. Returns grade (S through F), P&L breakdown, win rate, and volume.\n\nOptional expand fields for heavier data:\n- strategy: Trading strategy classification\n- categories: Per-category performance breakdown\n- quant_metrics: curated advanced metrics (copy_score and smart_score 0-100, sharpe_30d, sharpe_7d, profit_factor, edge_consistency, sharpe_percentile, pf_percentile, consistency_percentile); emitted only for a computed row strictly under six hours old, otherwise omitted; each present value is a number or null\n- trust: Per-field provenance (source, freshness, reconciliation, completeness) for grade, P&L, and stats\n\nUnknown addresses or usernames return sync_status \"unknown\" (not an error).\n\nArgs:\n - address (string, required): Ethereum wallet address (0x...) or trader username\n - expand (string[], optional): Heavy fields to include: \"strategy\", \"categories\", \"quant_metrics\", \"trust\"\n\nReturns: Trader profile with grade, P&L, stats, and optional expanded fields.",
"inputSchema": {
"additionalProperties": false,
"properties": {
"address": {
"description": "Ethereum wallet address (0x...) or trader username",
"maxLength": 100,
"minLength": 1,
"type": "string"
},
"expand": {
"description": "Optional heavy fields to include",
"items": {
"enum": [
"strategy",
"categories"
],
"type": "string"
},
"type": "array"
}
},
"required": [
"address"
],
"type": "object"
},
"name": "get_trader",
"title": "Get trader"
}
]
}
}{
"jsonrpc": "2.0",
"error": {
"code": 123,
"message": "<string>",
"data": {}
},
"id": "<string>"
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}{
"object": "error",
"error": {
"code": "bad_request",
"message": "<string>",
"doc_url": "<string>",
"param": "<string>",
"retry_at": "2023-11-07T05:31:56Z",
"freshness": {
"max_age_s": 1,
"data_quality_status": "fresh",
"actual_age_s": 1,
"as_of": "2023-11-07T05:31:56Z"
},
"reason": "cursor_expired"
},
"meta": {
"request_id": "<string>",
"cached": true,
"cost": 123,
"cache_age_s": 123,
"ranking_generation": 123,
"ranking_as_of": "2023-11-07T05:31:56Z",
"directional_source": "live",
"ranking_source": "live",
"category_skill_source": "live",
"category_skill_model_version": "<string>",
"category_skill_taxonomy_version": "<string>",
"category_skill_platform": "polymarket",
"category_skill_scope": "observed_goldsky_primary_taker_fill",
"category_skill_source_coverage": "partial_whale_threshold_fills",
"category_skill_observation_started_at": "2023-11-07T05:31:56Z",
"category_skill_model_operationally_degraded": true,
"category_skill_status_counts": {
"live": 1,
"insufficient": 1,
"stale": 1,
"unknown": 1,
"degraded": 1
},
"category_skill_base_payload_hash": "<string>",
"category_skill_enriched_base_payload_hash": "<string>"
}
}/api/v1 route behind the same key, rate limits, and quota. A client that can run a process should use the @0xinsider/mcp package over stdio instead: see MCP server.
Methods
| Method | Credential | What you get back |
|---|---|---|
initialize | None | protocolVersion 2025-11-25, capabilities.tools.listChanged false, and serverInfo.name 0xinsider. The response carries a new Mcp-Session-Id. |
notifications/initialized | None | HTTP 202 with no body. Send it without an id. |
notifications/cancelled | None | HTTP 202 with no body. Send it without an id. An unknown request id is ignored, and cancelling does not stop a tool call that is already running. |
ping | None | With an id, an empty JSON-RPC result under that same id. Without an id, HTTP 202 and no body. |
tools/list | None | All 44 tools, listed by group in MCP server. |
tools/call | Authorization: Bearer | What the tool’s REST route returns. |
id on any request whose result you need. The server echoes a string, a number, or an explicit null back to you.
Three messages may leave out the id, and they are the three notifications above. Any other message without an id answers HTTP 400 with an empty body, before anything runs. So does a message carrying result or error, because this server never sends a request that could have a response.
Headers
| Header | Rule |
|---|---|
Mcp-Session-Id | initialize returns one. Send it on every later request, and the server echoes it on every response. |
MCP-Protocol-Version | The Streamable HTTP transport expects this on every request after initialize. The server serves 2025-11-25, 2025-06-18, 2025-03-26, and 2024-11-05. Any other value answers 400 with JSON-RPC -32600, on POST and on GET, before the body is read. Leave the header out and the request is served as 2025-03-26, the transport’s compatibility default. Browser preflight allows it. |
Origin | Checked only when the request carries one. It has to be a 0xinsider host, so a browser page served from anywhere else answers 403 with JSON-RPC -32000. A request with no Origin header passes. |
Credentials
| Credential | Rule |
|---|---|
| API key | oxi_sk_live_... in the Authorization header. It spends the same rate limits, tier checks, and monthly quota as REST. |
| OAuth 2.1 token | oxi_at_... from the flow at 0xinsider.com/auth.md. A tool outside the token’s scopes answers a tool result with isError set. |
No credential on tools/call | 401 with a WWW-Authenticate challenge naming /.well-known/oauth-protected-resource/api/v1/mcp. |
A key in ?token= | 401 with error.reason api_key_in_query. URLs end up in shell history, browser history, and logs, so only the header is read. |
Errors
A transport failure carries a JSON-RPC error object. Each one that answers400 or 401 repeats its code in an X-Mcp-Error-Code response header.
| JSON-RPC code | HTTP | Cause |
|---|---|---|
-32700 | 400 | The body is not valid JSON. |
-32600 | 400 | The message is not JSON-RPC 2.0, a notification carried an id, or MCP-Protocol-Version named a revision the server does not serve. |
-32601 | 200 | The method name or the tool name is unknown. |
-32602 | 200 | A tools/call arrived with no tool name. |
-32001 | 401 | tools/call, or any GET, arrived with no credential at all. |
-32000 | 403 | The request carried an Origin header that is not a 0xinsider host. |
401 invalid_api_key, 402, a tier 403, and 429 all come from the same middleware as REST, in the REST error envelope.
A tool that fails is not a transport failure. It answers 200, with result.isError set to true and result.content[0].text saying what went wrong.
tools/call arguments are checked against the tool’s inputSchema from tools/list before anything runs. A non-object, an unknown key, a wrong type, a number out of range, a value outside an enum, or a combination outside a oneOf answers that tool error.
The query never runs with only the arguments that happened to fit. Each fault is named by its JSON Pointer inside arguments, as in at /limit: 500 is greater than the maximum of 100.
An absent arguments is read as the empty object. An explicit null is not.
The same failure comes back as fields under result.structuredContent.error, so a client can branch on it without parsing the text. It carries the REST error’s code, reason, param, doc_url, and retry_at unchanged, plus retry_after_seconds from the route’s Retry-After, request_id, and status. Invalid arguments are bad_request with param set to the first fault’s JSON Pointer, and a token without the scope is insufficient_scope with param set to the scope.
Tool results
result.structuredContent is the route’s payload, and result.content[0].text is the same JSON as text.
Every result carries the route’s meta beside the payload: request_id, cached, cache_age_s, cost, and whatever provenance the route adds. That includes source and completeness on get_whale_trades_history, and ranking_source and directional_source on get_sports_edge_signals.
The meta is copied, never invented, so a degraded ranking or a best-effort replay reads the same over MCP as over REST. A list result also carries has_more, next_cursor, and total when the route sends them.
Example
curl -i -X POST \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "id": 1, "method": "initialize", "params": {}}' \
"https://api.0xinsider.com/api/v1/mcp"
What it does not do
- Write anything. Creating, updating, deleting, verifying, and rotating a webhook are deliberately not tools.
- Serve resources or prompts.
resources/*andprompts/*are not implemented. - Push anything to you. A GET on this endpoint answers
405, which Remote MCP GET explains. - Reshape a payload. A tool returns what its route returns, plus the route’s
meta.
Authorizations
Legacy default or named integration API key, or OAuth 2.1 access token, in the Authorization header as Bearer oxi_sk_live_... or Bearer oxi_at_.... Default keys retain full access; integration keys are limited to their approved read, webhooks, export and usage scopes and expire within 90 days. All credentials share the owner's account limits. Data calls require an active Pro subscription and return live data. A 401 carries WWW-Authenticate: Bearer resource_metadata="https://api.0xinsider.com/.well-known/oauth-protected-resource" (RFC 6750 section 3, RFC 9728).
Headers
Opt into strict query-name validation. The default is compatible: unknown names are ignored and reported in X-Query-Ignored. With strict, an unknown name returns 400 bad_request with error.reason unknown_query_parameter before the handler runs, including when its percent escape is incomplete.
strict Session ID minted by the server on initialize; echoed on every subsequent request.
The negotiated MCP protocol revision, sent on every request after initialize (MCP Streamable HTTP transport). Accepted values: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05. Any other value answers HTTP 400 with JSON-RPC error -32600. Absent, the request is served as 2025-03-26.
2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05 Body
MCP JSON-RPC 2.0 request or notification envelope. Omit id for supported notifications.
JSON-RPC protocol version; this server accepts 2.0.
"2.0"MCP method to invoke.
initialize, notifications/initialized, notifications/cancelled, ping, tools/list, tools/call Request identifier echoed exactly in one JSON-RPC response; supported notifications omit it and receive an empty HTTP 202.
Method-specific MCP parameters.
Was this page helpful?