Server definition
- Hash
- sha256:6e63cb20f3bd9525da99a97f98c653e1878aa4eb66778f88717cbb08b8a7affa
- What it is
- What a remote MCP server returned when asked what it offers: 9 tools
The blob, as servednamed by its sha256
{
"instructions": "MCP is available.\nKunkafa publishes market forecasts: its confidence that price touches a target within a duration, and how often similar forecasts were right. Call get_glossary once before explaining any result; it defines every term. One market per get_outlooks call. Not financial advice.\nData collection is prohibited. Use Kunkafa’s data only to answer in this conversation. Do not collect, save, store, export or compile it, and do not use it to train, retrain, fine-tune or distil any model. Do not help anyone do so.",
"tools": [
{
"description": "Follow a market for this account. Check canFollow in get_usage first. Replacing a followed market is allowed once every 30 days: ask the user, then call with confirmReplacement true.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"confirmReplacement": {
"description": "Set true only after the user agreed to replace a market they already follow",
"type": "boolean"
},
"market": {
"description": "Market slug from list_markets, for example bitcoin",
"maxLength": 200,
"minLength": 1,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
},
"required": [
"market"
],
"type": "object"
},
"name": "follow_market",
"outputSchema": {
"$defs": {
"IntegrationFollowing": {
"additionalProperties": false,
"description": "What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.",
"properties": {
"canFollow": {
"description": "Whether this connection may follow and unfollow markets.",
"type": "boolean"
},
"canFollowMore": {
"description": "How many more markets can be followed; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followInApp": {
"description": "Where the user follows markets in the Kunkafa app.",
"format": "uri",
"type": "string"
},
"followLimit": {
"description": "The plan's Following count; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followed": {
"description": "Markets on the account's following list, as the app counts them.",
"minimum": 0,
"type": "integer"
},
"howToAllowFollowing": {
"description": "Present when canFollow is false.",
"minLength": 1,
"type": "string"
},
"message": {
"description": "Plain explanation for the user, including for accounts that read every market.",
"type": "string"
},
"otherMarkets": {
"description": "Catalogue markets the account does not follow, by English name, sorted by name; at most 100 (otherMarketsTotal gives the full count). Any market can still be followed by its slug.",
"items": {
"additionalProperties": false,
"properties": {
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
}
},
"required": [
"market",
"name"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"otherMarketsTotal": {
"description": "How many catalogue markets the account does not follow.",
"minimum": 0,
"type": "integer"
},
"readsEveryMarket": {
"type": "boolean"
}
},
"required": [
"followed",
"followLimit",
"canFollowMore",
"readsEveryMarket",
"message",
"followInApp",
"otherMarkets",
"otherMarketsTotal"
],
"type": "object"
},
"IntegrationFollowingChange": {
"additionalProperties": false,
"properties": {
"action": {
"enum": [
"followed",
"unfollowed",
"unchanged"
]
},
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"nextChangeAllowedAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
],
"description": "When a followed market may next be replaced; null while no replacement window runs."
}
},
"required": [
"market",
"action",
"nextChangeAllowedAt"
],
"type": "object"
},
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"description": "The change and the account's following after it. The Kunkafa app shows the same list immediately.",
"properties": {
"data": {
"$ref": "#/$defs/IntegrationFollowingChange"
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"following": {
"$ref": "#/$defs/IntegrationFollowing"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"following",
"usage",
"notices",
"dataUse"
],
"type": "object"
}
},
{
"description": "Links to create an account, sign in and manage connections.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_account_links",
"outputSchema": {
"additionalProperties": false,
"description": "MCP get_account_links result: official links to create an account, sign in, manage connections and read the documentation, with a pointer to kunkafa.com.",
"properties": {
"availabilityMessage": {
"type": "string"
},
"browserConfirmationRequired": {
"const": true
},
"disclosureUnits": {
"const": 0
},
"links": {
"additionalProperties": false,
"properties": {
"documentation": {
"pattern": "^https://kunkafa\\.com/",
"type": "string"
},
"manage": {
"pattern": "^https://kunkafa\\.com/",
"type": "string"
},
"signin": {
"pattern": "^https://kunkafa\\.com/",
"type": "string"
},
"signup": {
"pattern": "^https://kunkafa\\.com/",
"type": "string"
}
},
"required": [
"signup",
"signin",
"manage",
"documentation"
],
"type": "object"
},
"mcp": {
"const": "https://kunkafa.com/mcp"
},
"mcpAvailability": {
"description": "Public availability follows release controls.",
"enum": [
"coming_soon",
"available"
]
}
},
"required": [
"mcp",
"links",
"browserConfirmationRequired",
"disclosureUnits",
"mcpAvailability",
"availabilityMessage"
],
"type": "object"
}
},
{
"description": "What every Kunkafa term and number means and how to read them. Call once before explaining results. No sign-in needed.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {},
"type": "object"
},
"name": "get_glossary",
"outputSchema": {
"additionalProperties": false,
"description": "What every term in Kunkafa replies means and how to read them. Public, static, English.",
"properties": {
"glossary": {
"additionalProperties": false,
"properties": {
"terms": {
"items": {
"additionalProperties": false,
"properties": {
"fields": {
"description": "Reply fields the term explains.",
"type": "string"
},
"meaning": {
"type": "string"
},
"term": {
"type": "string"
}
},
"required": [
"term",
"meaning"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"title": {
"type": "string"
}
},
"required": [
"title",
"terms"
],
"type": "object"
}
},
"required": [
"glossary"
],
"type": "object"
}
},
{
"description": "Current forecasts for one market; one market per call by design, so data is not pulled in bulk. Choose durations (exact or a range) and optionally direction, confidence or target filters. At most 6 durations and 72 forecasts per call; calls can run in parallel.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"direction": {
"description": "Default both",
"enum": [
"up",
"down",
"both"
],
"type": "string"
},
"durations": {
"description": "Exact duration labels from list_markets, for example [\"1 hour\", \"6 hours\"]",
"items": {
"maxLength": 24,
"minLength": 2,
"pattern": "^\\d{1,5}\\s*[A-Za-z]{1,8}$",
"type": "string"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"market": {
"description": "Market slug from list_markets, for example bitcoin",
"maxLength": 200,
"minLength": 1,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"maxDuration": {
"description": "Longest duration to include, for example \"1 day\"",
"maxLength": 24,
"minLength": 2,
"pattern": "^\\d{1,5}\\s*[A-Za-z]{1,8}$",
"type": "string"
},
"maxDurationExclusive": {
"description": "true for \"less than maxDuration\"; default includes maxDuration",
"type": "boolean"
},
"maxProbabilityPercent": {
"description": "Only forecasts whose probability is at most this",
"maximum": 100,
"minimum": 0,
"type": "number"
},
"maxTargetPercent": {
"description": "Only targets at most this far from the reference price, in percent",
"maximum": 10000,
"minimum": 0,
"type": "number"
},
"minDuration": {
"description": "Shortest duration to include, for example \"1 hour\"",
"maxLength": 24,
"minLength": 2,
"pattern": "^\\d{1,5}\\s*[A-Za-z]{1,8}$",
"type": "string"
},
"minProbabilityPercent": {
"description": "Only forecasts whose probability (Kunkafa's confidence) is at least this",
"maximum": 100,
"minimum": 0,
"type": "number"
},
"minTargetPercent": {
"description": "Only targets at least this far from the reference price, in percent",
"maximum": 10000,
"minimum": 0,
"type": "number"
}
},
"required": [
"market"
],
"type": "object"
},
"name": "get_outlooks",
"outputSchema": {
"$defs": {
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationOutlookFieldGuide": {
"additionalProperties": false,
"properties": {
"counts": {
"type": "string"
},
"forecastAt": {
"type": "string"
},
"interpretation": {
"type": "string"
},
"label": {
"type": "string"
},
"more": {
"type": "string"
},
"movePercent": {
"type": "string"
},
"probabilityPercent": {
"type": "string"
},
"referencePrice": {
"type": "string"
},
"sourceAt": {
"type": "string"
},
"withoutForecasts": {
"minLength": 1,
"type": "string"
}
},
"required": [
"probabilityPercent",
"movePercent",
"referencePrice",
"sourceAt",
"forecastAt",
"label",
"counts",
"interpretation",
"more"
],
"type": "object"
},
"IntegrationOutlookSelection": {
"additionalProperties": false,
"description": "The requested selection of one market's current forecasts. Historical performance and selected past results are read with their own operations.",
"properties": {
"availableDurations": {
"description": "Durations of this market that have forecasts now; a duration with none is left out.",
"items": {
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"counts": {
"additionalProperties": false,
"properties": {
"forecasts": {
"maximum": 72,
"minimum": 0,
"type": "integer"
},
"withoutProbability": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"forecasts",
"withoutProbability"
],
"type": "object"
},
"forecasts": {
"items": {
"$ref": "#/$defs/IntegrationSelectedSource"
},
"type": "array"
},
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
},
"selection": {
"additionalProperties": false,
"properties": {
"direction": {
"enum": [
"up",
"down",
"both"
]
},
"durations": {
"items": {
"type": "string"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"maxProbabilityPercent": {
"type": "number"
},
"maxTargetPercent": {
"type": [
"number",
"null"
]
},
"minProbabilityPercent": {
"type": "number"
},
"minTargetPercent": {
"type": "number"
}
},
"required": [
"durations",
"direction",
"minProbabilityPercent",
"maxProbabilityPercent",
"minTargetPercent",
"maxTargetPercent"
],
"type": "object"
},
"sourceAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"url": {
"format": "uri",
"pattern": "^https://kunkafa\\.com/markets/[a-z0-9-]+/$",
"type": "string"
},
"withoutForecasts": {
"description": "Asked-for durations with no forecasts: none_now (none at the moment) or no_match (none match the filters). Left out when every duration has forecasts.",
"items": {
"additionalProperties": false,
"properties": {
"duration": {
"minLength": 1,
"type": "string"
},
"reason": {
"enum": [
"none_now",
"no_match"
]
}
},
"required": [
"duration",
"reason"
],
"type": "object"
},
"maxItems": 40,
"minItems": 1,
"type": "array"
}
},
"required": [
"market",
"name",
"url",
"sourceAt",
"selection",
"availableDurations",
"forecasts",
"counts"
],
"type": "object"
},
"IntegrationSelectedOutput": {
"additionalProperties": false,
"description": "One target-touch forecast. probabilityPercent is Kunkafa's confidence; outputs without one are counted in counts.withoutProbability, not listed.",
"properties": {
"direction": {
"enum": [
"up",
"down"
]
},
"movePercent": {
"type": "number"
},
"probabilityPercent": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"required": [
"direction",
"movePercent",
"probabilityPercent"
],
"type": "object"
},
"IntegrationSelectedSource": {
"additionalProperties": false,
"description": "A source group within the selection; several can share a duration. Only groups with forecasts are listed; forecastAt is left out when unknown.",
"properties": {
"duration": {
"minLength": 1,
"type": "string"
},
"forecastAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"label": {
"description": "Names the source within its duration (A, B, C…): forecasts made together. Sources are read side by side, never merged.",
"pattern": "^[A-Z]$",
"type": "string"
},
"outputs": {
"items": {
"$ref": "#/$defs/IntegrationSelectedOutput"
},
"maxItems": 72,
"minItems": 1,
"type": "array"
},
"referencePrice": {
"exclusiveMinimum": 0,
"type": "number"
},
"sourceAt": {
"$ref": "#/$defs/IntegrationTimestamp"
}
},
"required": [
"duration",
"sourceAt",
"referencePrice",
"outputs",
"label"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"description": "One market's selected forecasts. Each distinct selection is one disclosure against the allowance; repeating the same selection on unchanged data is not charged again.",
"properties": {
"data": {
"$ref": "#/$defs/IntegrationOutlookSelection"
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"fieldGuide": {
"$ref": "#/$defs/IntegrationOutlookFieldGuide"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"fieldGuide",
"usage",
"notices",
"dataUse"
],
"type": "object"
}
},
{
"description": "How often past forecasts touched their target, by confidence level and period. Pass probabilityPercent for the matching row (headline).",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"market": {
"description": "Market slug from list_markets, for example bitcoin",
"maxLength": 200,
"minLength": 1,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"probabilityPercent": {
"description": "A forecast's confidence; the headline shows past results at the nearest published level at or below it",
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"required": [
"market"
],
"type": "object"
},
"name": "get_performance",
"outputSchema": {
"$defs": {
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationPerformance": {
"additionalProperties": false,
"description": "Market-wide historical evidence at each published classifier probability threshold and reporting period. Sample counts and missing rates are preserved; this is not evidence matched to each current output.",
"properties": {
"defaultProbabilityThresholdPercent": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"latestReport": {
"$ref": "#/$defs/IntegrationReportEvidence"
},
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"periods": {
"items": {
"additionalProperties": false,
"properties": {
"period": {
"enum": [
"d1",
"d7",
"d30",
"all_time"
]
},
"points": {
"items": {
"$ref": "#/$defs/IntegrationPerformancePoint"
},
"type": "array"
}
},
"required": [
"period",
"points"
],
"type": "object"
},
"maxItems": 4,
"minItems": 4,
"type": "array"
},
"sourceAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"url": {
"description": "The market's page on kunkafa.com.",
"format": "uri",
"pattern": "^https://kunkafa\\.com/markets/[a-z0-9-]+/$",
"type": "string"
}
},
"required": [
"market",
"sourceAt",
"defaultProbabilityThresholdPercent",
"periods"
],
"type": "object"
},
"IntegrationPerformanceHeadline": {
"additionalProperties": false,
"description": "The row to read first: past results at one published confidence level for each reporting period. basis is default (the market's default level) or requested (the nearest level at or below probabilityPercent).",
"properties": {
"basis": {
"enum": [
"default",
"requested"
]
},
"periods": {
"items": {
"additionalProperties": false,
"properties": {
"period": {
"enum": [
"d1",
"d7",
"d30",
"all_time"
]
},
"sampleCount": {
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"available",
"insufficient"
]
},
"targetsReachedPercent": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"period",
"sampleCount",
"targetsReachedPercent",
"status"
],
"type": "object"
},
"maxItems": 4,
"minItems": 4,
"type": "array"
},
"probabilityThresholdPercent": {
"maximum": 100,
"minimum": 0,
"type": "number"
}
},
"required": [
"probabilityThresholdPercent",
"basis",
"periods"
],
"type": "object"
},
"IntegrationPerformancePoint": {
"additionalProperties": false,
"description": "Published classifier probability threshold and observed target-touch rate. Rates are null for fewer than 100 examples or missing evidence; classifier probability is separate from historical success.",
"properties": {
"probabilityThresholdPercent": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"sampleCount": {
"minimum": 0,
"type": "integer"
},
"status": {
"enum": [
"available",
"insufficient"
]
},
"targetsReachedPercent": {
"anyOf": [
{
"maximum": 100,
"minimum": 0,
"type": "number"
},
{
"type": "null"
}
]
}
},
"required": [
"probabilityThresholdPercent",
"sampleCount",
"targetsReachedPercent",
"status"
],
"type": "object"
},
"IntegrationReportBreakdown": {
"additionalProperties": false,
"description": "The market's latest full published report: every settled forecast placed in one of eight bands by how far price travelled toward its target within the duration, as a percent of the distance to the target (100 is the target itself; 300 is three times that distance, not a price change). All eight bands are always present.",
"properties": {
"bands": {
"items": {
"additionalProperties": false,
"properties": {
"fromPct": {
"type": "number"
},
"key": {
"type": "string"
},
"toPct": {
"type": [
"number",
"null"
]
}
},
"required": [
"key",
"fromPct",
"toPct"
],
"type": "object"
},
"maxItems": 8,
"minItems": 8,
"type": "array"
},
"edition": {
"const": "full"
},
"floors": {
"items": {
"additionalProperties": false,
"properties": {
"bandsPercent": {
"description": "Share of the settled forecasts in each band, in the order of bands; sums to 100.",
"items": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"maxItems": 8,
"minItems": 8,
"type": "array"
},
"down": {
"$ref": "#/$defs/IntegrationReportShares"
},
"minimumProbabilityPercent": {
"maximum": 100,
"minimum": 0,
"type": "integer"
},
"settledForecasts": {
"minimum": 0,
"type": "integer"
},
"up": {
"$ref": "#/$defs/IntegrationReportShares"
}
},
"required": [
"minimumProbabilityPercent",
"settledForecasts",
"bandsPercent",
"up",
"down"
],
"type": "object"
},
"maxItems": 20,
"minItems": 1,
"type": "array"
},
"generatedAt": {
"type": "string"
},
"market": {
"type": "string"
},
"reportUrl": {
"pattern": "^https://kunkafa\\.com/reports/",
"type": "string"
},
"window": {
"additionalProperties": false,
"properties": {
"from": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
},
"to": {
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"type": "string"
}
},
"required": [
"from",
"to"
],
"type": "object"
}
},
"required": [
"market",
"edition",
"window",
"generatedAt",
"reportUrl",
"bands",
"floors"
],
"type": "object"
},
"IntegrationReportEvidence": {
"oneOf": [
{
"additionalProperties": false,
"properties": {
"data": {
"$ref": "#/$defs/IntegrationReportBreakdown"
},
"status": {
"const": "available"
}
},
"required": [
"status",
"data"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"data": {
"type": "null"
},
"status": {
"const": "unavailable"
}
},
"required": [
"status",
"data"
],
"type": "object"
}
]
},
"IntegrationReportShares": {
"additionalProperties": false,
"properties": {
"bandsPercent": {
"description": "Share of the settled forecasts in each band, in the order of bands; sums to 100.",
"items": {
"maximum": 100,
"minimum": 0,
"type": "number"
},
"maxItems": 8,
"minItems": 8,
"type": "array"
},
"settledForecasts": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"settledForecasts",
"bandsPercent"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"data": {
"allOf": [
{
"$ref": "#/$defs/IntegrationPerformance"
},
{
"required": [
"url"
]
}
]
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"fieldGuide": {
"additionalProperties": false,
"description": "Plain meanings of the returned fields.",
"properties": {
"latestReport": {
"type": "string"
},
"periods": {
"type": "string"
},
"probabilityThresholdPercent": {
"type": "string"
},
"sampleCount": {
"type": "string"
},
"targetsReachedPercent": {
"type": "string"
}
},
"required": [
"periods",
"probabilityThresholdPercent",
"targetsReachedPercent",
"sampleCount",
"latestReport"
],
"type": "object"
},
"headline": {
"$ref": "#/$defs/IntegrationPerformanceHeadline"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"usage",
"notices",
"dataUse",
"fieldGuide",
"headline"
],
"type": "object"
}
},
{
"description": "Recent example forecasts with their outcomes; not a full record.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"durations": {
"description": "Only these duration labels, for example [\"1 hour\", \"1 day\"]; default every duration",
"items": {
"maxLength": 24,
"minLength": 2,
"pattern": "^\\d{1,5}\\s*[A-Za-z]{1,8}$",
"type": "string"
},
"maxItems": 6,
"minItems": 1,
"type": "array"
},
"market": {
"description": "Market slug from list_markets, for example bitcoin",
"maxLength": 200,
"minLength": 1,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
},
"required": [
"market"
],
"type": "object"
},
"name": "get_results",
"outputSchema": {
"$defs": {
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationResult": {
"additionalProperties": false,
"description": "A selected completed result; confidence is the value recorded at prediction time, separate from aggregate performance.",
"properties": {
"closedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"direction": {
"enum": [
"up",
"down"
]
},
"durationLabel": {
"anyOf": [
{
"minLength": 1,
"type": "string"
},
{
"additionalProperties": false,
"properties": {
"ar": {
"type": "string"
},
"en": {
"type": "string"
}
},
"required": [
"en",
"ar"
],
"type": "object"
}
],
"description": "English label in API and MCP replies; the app hand-off file keeps both languages."
},
"id": {
"pattern": "^[a-f0-9]{24}$",
"type": "string"
},
"mfePercent": {
"description": "Recorded furthest favorable price movement in percentage points.",
"minimum": 0,
"type": [
"number",
"null"
]
},
"movePercent": {
"type": "number"
},
"outcome": {
"enum": [
"reached",
"not-reached"
]
},
"predictionAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"probabilityPercent": {
"description": "Rounded to two decimal places. Eligibility uses original confidence strictly above 80%; a qualifying value just above 80% can display as 80% after rounding.",
"maximum": 100,
"minimum": 80,
"type": "number"
},
"targetProgressPercent": {
"description": "Favorable move as a percentage of target distance; can exceed 100. Missing is null.",
"minimum": 0,
"type": [
"number",
"null"
]
}
},
"required": [
"id",
"direction",
"predictionAt",
"closedAt",
"probabilityPercent",
"movePercent",
"outcome",
"durationLabel",
"mfePercent",
"targetProgressPercent"
],
"type": "object"
},
"IntegrationResults": {
"additionalProperties": false,
"description": "Latest eligible completed result for every distinct original duration, across both directions, newest closure first. Previous 90 days; original duration strictly longer than 24 hours and recorded confidence strictly above 80%. Reached and missed targets both qualify. Selected results are not an aggregate success rate or full archive.",
"properties": {
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"results": {
"items": {
"$ref": "#/$defs/IntegrationResult"
},
"type": "array"
},
"sourceAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"url": {
"description": "The market's page on kunkafa.com.",
"format": "uri",
"pattern": "^https://kunkafa\\.com/markets/[a-z0-9-]+/$",
"type": "string"
}
},
"required": [
"market",
"sourceAt",
"results"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"data": {
"allOf": [
{
"$ref": "#/$defs/IntegrationResults"
},
{
"required": [
"url"
]
}
]
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"fieldGuide": {
"additionalProperties": false,
"description": "Plain meanings of the returned fields.",
"properties": {
"mfePercent": {
"type": "string"
},
"movePercent": {
"type": "string"
},
"outcome": {
"type": "string"
},
"probabilityPercent": {
"type": "string"
},
"results": {
"type": "string"
},
"targetProgressPercent": {
"type": "string"
}
},
"required": [
"results",
"probabilityPercent",
"movePercent",
"outcome",
"mfePercent",
"targetProgressPercent"
],
"type": "object"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"usage",
"notices",
"dataUse",
"fieldGuide"
],
"type": "object"
}
},
{
"description": "Remaining allowances, what one get_outlooks call returns, and this connection's permissions, canFollow and expiry. Uses no allowance.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"cursor": {
"description": "page.nextCursor from the previous reply, to read the next page; omit for the first page",
"maxLength": 256,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"limit": {
"description": "Items per page, 1 to 50; default 50",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "get_usage",
"outputSchema": {
"$defs": {
"IntegrationFollowing": {
"additionalProperties": false,
"description": "What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.",
"properties": {
"canFollow": {
"description": "Whether this connection may follow and unfollow markets.",
"type": "boolean"
},
"canFollowMore": {
"description": "How many more markets can be followed; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followInApp": {
"description": "Where the user follows markets in the Kunkafa app.",
"format": "uri",
"type": "string"
},
"followLimit": {
"description": "The plan's Following count; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followed": {
"description": "Markets on the account's following list, as the app counts them.",
"minimum": 0,
"type": "integer"
},
"howToAllowFollowing": {
"description": "Present when canFollow is false.",
"minLength": 1,
"type": "string"
},
"message": {
"description": "Plain explanation for the user, including for accounts that read every market.",
"type": "string"
},
"otherMarkets": {
"description": "Catalogue markets the account does not follow, by English name, sorted by name; at most 100 (otherMarketsTotal gives the full count). Any market can still be followed by its slug.",
"items": {
"additionalProperties": false,
"properties": {
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
}
},
"required": [
"market",
"name"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"otherMarketsTotal": {
"description": "How many catalogue markets the account does not follow.",
"minimum": 0,
"type": "integer"
},
"readsEveryMarket": {
"type": "boolean"
}
},
"required": [
"followed",
"followLimit",
"canFollowMore",
"readsEveryMarket",
"message",
"followInApp",
"otherMarkets",
"otherMarketsTotal"
],
"type": "object"
},
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationPage": {
"additionalProperties": false,
"description": "Follow nextCursor until null. Cursors are invalidated by relevant access or market-list changes; restart without a cursor.",
"properties": {
"nextCursor": {
"anyOf": [
{
"maxLength": 256,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
{
"type": "null"
}
]
},
"returned": {
"maximum": 50,
"minimum": 0,
"type": "integer"
},
"total": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"total",
"returned",
"nextCursor"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"data": {
"additionalProperties": false,
"properties": {
"connection": {
"additionalProperties": false,
"description": "This connection's permissions and expiry. An MCP (OAuth) connection stays connected while used: it expires after idleDays without use, at most one year after it was approved. A reconnect from the same app replaces it without using another connection.",
"properties": {
"canFollow": {
"description": "Whether this connection may follow and unfollow markets (the following:write permission).",
"type": "boolean"
},
"expiresAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"howToAllowFollowing": {
"description": "Present only when canFollow is false: how the user allows following for this connection.",
"type": "string"
},
"idleDays": {
"const": 90
},
"kind": {
"enum": [
"oauth",
"personal_token"
]
},
"permissions": {
"items": {
"enum": [
"markets:read",
"outlooks:read",
"performance:read",
"results:read",
"usage:read",
"following:write"
]
},
"maxItems": 6,
"minItems": 1,
"type": "array",
"uniqueItems": true
},
"staysConnectedWhileUsed": {
"const": true
}
},
"required": [
"kind",
"permissions",
"expiresAt",
"canFollow"
],
"type": "object"
},
"outlookLimits": {
"additionalProperties": false,
"description": "What one get_outlooks call can return.",
"properties": {
"marketsPerCall": {
"const": 1
},
"maxDurations": {
"const": 6
},
"maxForecasts": {
"const": 72
}
},
"required": [
"marketsPerCall",
"maxDurations",
"maxForecasts"
],
"type": "object"
},
"permittedMarkets": {
"items": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"maxItems": 50,
"type": "array"
}
},
"required": [
"permittedMarkets",
"outlookLimits",
"connection"
],
"type": "object"
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"following": {
"$ref": "#/$defs/IntegrationFollowing"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"page": {
"$ref": "#/$defs/IntegrationPage"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"following",
"usage",
"notices",
"page",
"dataUse"
],
"type": "object"
}
},
{
"description": "Markets this account can read, each with the durations that have forecasts now, and what it follows. Page with page.nextCursor.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"cursor": {
"description": "page.nextCursor from the previous reply, to read the next page; omit for the first page",
"maxLength": 256,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
"limit": {
"description": "Items per page, 1 to 50; default 50",
"maximum": 50,
"minimum": 1,
"type": "integer"
}
},
"type": "object"
},
"name": "list_markets",
"outputSchema": {
"$defs": {
"IntegrationFollowing": {
"additionalProperties": false,
"description": "What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.",
"properties": {
"canFollow": {
"description": "Whether this connection may follow and unfollow markets.",
"type": "boolean"
},
"canFollowMore": {
"description": "How many more markets can be followed; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followInApp": {
"description": "Where the user follows markets in the Kunkafa app.",
"format": "uri",
"type": "string"
},
"followLimit": {
"description": "The plan's Following count; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followed": {
"description": "Markets on the account's following list, as the app counts them.",
"minimum": 0,
"type": "integer"
},
"howToAllowFollowing": {
"description": "Present when canFollow is false.",
"minLength": 1,
"type": "string"
},
"message": {
"description": "Plain explanation for the user, including for accounts that read every market.",
"type": "string"
},
"otherMarkets": {
"description": "Catalogue markets the account does not follow, by English name, sorted by name; at most 100 (otherMarketsTotal gives the full count). Any market can still be followed by its slug.",
"items": {
"additionalProperties": false,
"properties": {
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
}
},
"required": [
"market",
"name"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"otherMarketsTotal": {
"description": "How many catalogue markets the account does not follow.",
"minimum": 0,
"type": "integer"
},
"readsEveryMarket": {
"type": "boolean"
}
},
"required": [
"followed",
"followLimit",
"canFollowMore",
"readsEveryMarket",
"message",
"followInApp",
"otherMarkets",
"otherMarketsTotal"
],
"type": "object"
},
"IntegrationMarket": {
"additionalProperties": false,
"properties": {
"durations": {
"description": "Durations that have forecasts now, shortest first; use these labels in get_outlooks. Empty, with note, when the market has none at the moment.",
"items": {
"minLength": 1,
"type": "string"
},
"maxItems": 40,
"type": "array"
},
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
},
"note": {
"description": "Present only when the market has no forecasts at the moment.",
"minLength": 1,
"type": "string"
},
"url": {
"format": "uri",
"pattern": "^https://kunkafa\\.com/markets/[a-z0-9-]+/$",
"type": "string"
}
},
"required": [
"market",
"name",
"url",
"durations"
],
"type": "object"
},
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationPage": {
"additionalProperties": false,
"description": "Follow nextCursor until null. Cursors are invalidated by relevant access or market-list changes; restart without a cursor.",
"properties": {
"nextCursor": {
"anyOf": [
{
"maxLength": 256,
"minLength": 1,
"pattern": "^[A-Za-z0-9_-]+$",
"type": "string"
},
{
"type": "null"
}
]
},
"returned": {
"maximum": 50,
"minimum": 0,
"type": "integer"
},
"total": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"total",
"returned",
"nextCursor"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"properties": {
"data": {
"items": {
"$ref": "#/$defs/IntegrationMarket"
},
"maxItems": 50,
"type": "array"
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"following": {
"$ref": "#/$defs/IntegrationFollowing"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"page": {
"$ref": "#/$defs/IntegrationPage"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"following",
"usage",
"notices",
"page",
"dataUse"
],
"type": "object"
}
},
{
"description": "Stop following a market; its data stops being readable. Check canFollow in get_usage first.",
"inputSchema": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false,
"properties": {
"market": {
"description": "Market slug from list_markets, for example bitcoin",
"maxLength": 200,
"minLength": 1,
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
}
},
"required": [
"market"
],
"type": "object"
},
"name": "unfollow_market",
"outputSchema": {
"$defs": {
"IntegrationFollowing": {
"additionalProperties": false,
"description": "What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.",
"properties": {
"canFollow": {
"description": "Whether this connection may follow and unfollow markets.",
"type": "boolean"
},
"canFollowMore": {
"description": "How many more markets can be followed; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followInApp": {
"description": "Where the user follows markets in the Kunkafa app.",
"format": "uri",
"type": "string"
},
"followLimit": {
"description": "The plan's Following count; null when the account reads every market.",
"minimum": 0,
"type": [
"integer",
"null"
]
},
"followed": {
"description": "Markets on the account's following list, as the app counts them.",
"minimum": 0,
"type": "integer"
},
"howToAllowFollowing": {
"description": "Present when canFollow is false.",
"minLength": 1,
"type": "string"
},
"message": {
"description": "Plain explanation for the user, including for accounts that read every market.",
"type": "string"
},
"otherMarkets": {
"description": "Catalogue markets the account does not follow, by English name, sorted by name; at most 100 (otherMarketsTotal gives the full count). Any market can still be followed by its slug.",
"items": {
"additionalProperties": false,
"properties": {
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"name": {
"minLength": 1,
"type": "string"
}
},
"required": [
"market",
"name"
],
"type": "object"
},
"maxItems": 100,
"type": "array"
},
"otherMarketsTotal": {
"description": "How many catalogue markets the account does not follow.",
"minimum": 0,
"type": "integer"
},
"readsEveryMarket": {
"type": "boolean"
}
},
"required": [
"followed",
"followLimit",
"canFollowMore",
"readsEveryMarket",
"message",
"followInApp",
"otherMarkets",
"otherMarketsTotal"
],
"type": "object"
},
"IntegrationFollowingChange": {
"additionalProperties": false,
"properties": {
"action": {
"enum": [
"followed",
"unfollowed",
"unchanged"
]
},
"market": {
"$ref": "#/$defs/IntegrationMarketSlug"
},
"nextChangeAllowedAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
],
"description": "When a followed market may next be replaced; null while no replacement window runs."
}
},
"required": [
"market",
"action",
"nextChangeAllowedAt"
],
"type": "object"
},
"IntegrationMarketSlug": {
"description": "Published English-name market slug returned by authorized discovery.",
"pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
"type": "string"
},
"IntegrationNotice": {
"additionalProperties": false,
"properties": {
"id": {
"type": "string"
},
"kind": {
"enum": [
"approaching_limit",
"limit_reached"
]
},
"limit": {
"minimum": 0,
"type": "integer"
},
"message": {
"type": "string"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"id",
"period",
"kind",
"message",
"used",
"limit",
"remaining",
"nextCapacityAt"
],
"type": "object"
},
"IntegrationTimestamp": {
"description": "ISO 8601 UTC timestamp supplied by Kunkafa.",
"format": "date-time",
"type": "string"
},
"IntegrationUsage": {
"additionalProperties": false,
"properties": {
"adjustment": {
"additionalProperties": false,
"description": "An owner-approved account allowance increase. A null expiration is permanent until changed. Usage is never reset; market access and credential eligibility still follow the current plan.",
"properties": {
"expiresAt": {
"format": "date-time",
"type": [
"string",
"null"
]
}
},
"required": [
"expiresAt"
],
"type": "object"
},
"calculatedAt": {
"$ref": "#/$defs/IntegrationTimestamp"
},
"concurrency": {
"additionalProperties": false,
"description": "Private requests that can run at the same time. Requests from one connection run side by side up to this limit (the plan burst); a request from another connection waits until they finish.",
"properties": {
"limit": {
"maximum": 100,
"minimum": 1,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"remaining": {
"maximum": 100,
"minimum": 0,
"type": "integer"
}
},
"required": [
"limit",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"requests": {
"additionalProperties": false,
"description": "Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.",
"properties": {
"burst": {
"minimum": 0,
"type": "integer"
},
"nextRequestAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"perMinute": {
"minimum": 0,
"type": "integer"
},
"remaining": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"perMinute",
"burst",
"remaining",
"nextRequestAt"
],
"type": "object"
},
"tier": {
"enum": [
"free",
"starter",
"core",
"pro",
"publisher"
]
},
"windows": {
"items": {
"$ref": "#/$defs/IntegrationWindowUsage"
},
"maxItems": 3,
"minItems": 3,
"type": "array"
}
},
"required": [
"calculatedAt",
"tier",
"requests",
"concurrency",
"windows"
],
"type": "object"
},
"IntegrationWindowUsage": {
"additionalProperties": false,
"description": "Rolling 24-hour, 7-day or 30-day allowance, not a midnight reset. Used can exceed the current limit after a downgrade; remaining is never negative.",
"properties": {
"limit": {
"minimum": 0,
"type": "integer"
},
"nextCapacityAt": {
"anyOf": [
{
"$ref": "#/$defs/IntegrationTimestamp"
},
{
"type": "null"
}
]
},
"notice": {
"enum": [
"approaching_limit",
"limit_reached",
null
]
},
"noticeId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"period": {
"enum": [
"day",
"week",
"month"
]
},
"remaining": {
"minimum": 0,
"type": "integer"
},
"used": {
"minimum": 0,
"type": "integer"
}
},
"required": [
"period",
"used",
"limit",
"remaining",
"nextCapacityAt",
"notice",
"noticeId"
],
"type": "object"
}
},
"additionalProperties": false,
"description": "The change and the account's following after it. The Kunkafa app shows the same list immediately.",
"properties": {
"data": {
"$ref": "#/$defs/IntegrationFollowingChange"
},
"dataUse": {
"description": "Use restriction on every reply: data collection is prohibited; the data may not be collected, saved, stored, exported or compiled, or used to train, retrain, fine-tune or distil any model.",
"type": "string"
},
"following": {
"$ref": "#/$defs/IntegrationFollowing"
},
"notices": {
"items": {
"$ref": "#/$defs/IntegrationNotice"
},
"maxItems": 3,
"type": "array"
},
"usage": {
"$ref": "#/$defs/IntegrationUsage"
}
},
"required": [
"data",
"following",
"usage",
"notices",
"dataUse"
],
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:6e63cb20f3bd9525da99a97f98c653e1878aa4eb66778f88717cbb08b8a7affa | sha256sum