MCP 서버

Kunkafa

com.kunkafa/kunkafa
데이터 및 분석 금융 및 투자 공개 · 연결 가능 MCP 2025-11-25

이 MCP로 할 수 있는 일

Provides market forecasts, forecast outcomes, historical performance, available markets, and account usage information.

follow_market
Follow a market
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.
파괴적 작업 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['market'], 'properties': {'market': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'maxLength': 200, 'minLength': 1, 'description': 'Market slug from list_markets, for example bitcoin'}, 'confirmReplacement': {'type': 'boolean', 'description': 'Set true only after the user agreed to replace a market they already follow'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationFollowing': {'type': 'object', 'required': ['followed', 'followLimit', 'canFollowMore', 'readsEveryMarket', 'message', 'followInApp', 'otherMarkets', 'otherMarketsTotal'], 'properties': {'message': {'type': 'string', 'description': 'Plain explanation for the user, including for accounts that read every market.'}, 'followed': {'type': 'integer', 'minimum': 0, 'description': "Markets on the account's following list, as the app counts them."}, 'canFollow': {'type': 'boolean', 'description': 'Whether this connection may follow and unfollow markets.'}, 'followInApp': {'type': 'string', 'format': 'uri', 'description': 'Where the user follows markets in the Kunkafa app.'}, 'followLimit': {'type': ['integer', 'null'], 'minimum': 0, 'description': "The plan's Following count; null when the account reads every market."}, 'otherMarkets': {'type': 'array', 'items': {'type': 'object', 'required': ['market', 'name'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}}, 'additionalProperties': False}, 'maxItems': 100, '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.'}, 'canFollowMore': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'How many more markets can be followed; null when the account reads every market.'}, 'readsEveryMarket': {'type': 'boolean'}, 'otherMarketsTotal': {'type': 'integer', 'minimum': 0, 'description': 'How many catalogue markets the account does not follow.'}, 'howToAllowFollowing': {'type': 'string', 'minLength': 1, 'description': 'Present when canFollow is false.'}}, 'description': 'What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.', 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'IntegrationFollowingChange': {'type': 'object', 'required': ['market', 'action', 'nextChangeAllowedAt'], '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.'}}, 'additionalProperties': False}}, 'required': ['data', 'following', 'usage', 'notices', 'dataUse'], 'properties': {'data': {'$ref': '#/$defs/IntegrationFollowingChange'}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'following': {'$ref': '#/$defs/IntegrationFollowing'}}, 'description': "The change and the account's following after it. The Kunkafa app shows the same list immediately.", 'additionalProperties': False}
get_account_links
Kunkafa account links
Links to create an account, sign in and manage connections.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['mcp', 'links', 'browserConfirmationRequired', 'disclosureUnits', 'mcpAvailability', 'availabilityMessage'], 'properties': {'mcp': {'const': 'https://kunkafa.com/mcp'}, 'links': {'type': 'object', 'required': ['signup', 'signin', 'manage', 'documentation'], 'properties': {'manage': {'type': 'string', 'pattern': '^https://kunkafa\\.com/'}, 'signin': {'type': 'string', 'pattern': '^https://kunkafa\\.com/'}, 'signup': {'type': 'string', 'pattern': '^https://kunkafa\\.com/'}, 'documentation': {'type': 'string', 'pattern': '^https://kunkafa\\.com/'}}, 'additionalProperties': False}, 'disclosureUnits': {'const': 0}, 'mcpAvailability': {'enum': ['coming_soon', 'available'], 'description': 'Public availability follows release controls.'}, 'availabilityMessage': {'type': 'string'}, 'browserConfirmationRequired': {'const': True}}, '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.', 'additionalProperties': False}
get_glossary
Glossary
What every Kunkafa term and number means and how to read them. Call once before explaining results. No sign-in needed.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {}, 'additionalProperties': False}
출력 스키마
{'type': 'object', 'required': ['glossary'], 'properties': {'glossary': {'type': 'object', 'required': ['title', 'terms'], 'properties': {'terms': {'type': 'array', 'items': {'type': 'object', 'required': ['term', 'meaning'], 'properties': {'term': {'type': 'string'}, 'fields': {'type': 'string', 'description': 'Reply fields the term explains.'}, 'meaning': {'type': 'string'}}, 'additionalProperties': False}, 'minItems': 1}, 'title': {'type': 'string'}}, 'additionalProperties': False}}, 'description': 'What every term in Kunkafa replies means and how to read them. Public, static, English.', 'additionalProperties': False}
get_outlooks
Current forecasts
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.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['market'], 'properties': {'market': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'maxLength': 200, 'minLength': 1, 'description': 'Market slug from list_markets, for example bitcoin'}, 'direction': {'enum': ['up', 'down', 'both'], 'type': 'string', 'description': 'Default both'}, 'durations': {'type': 'array', 'items': {'type': 'string', 'pattern': '^\\d{1,5}\\s*[A-Za-z]{1,8}$', 'maxLength': 24, 'minLength': 2}, 'maxItems': 6, 'minItems': 1, 'description': 'Exact duration labels from list_markets, for example ["1 hour", "6 hours"]'}, 'maxDuration': {'type': 'string', 'pattern': '^\\d{1,5}\\s*[A-Za-z]{1,8}$', 'maxLength': 24, 'minLength': 2, 'description': 'Longest duration to include, for example "1 day"'}, 'minDuration': {'type': 'string', 'pattern': '^\\d{1,5}\\s*[A-Za-z]{1,8}$', 'maxLength': 24, 'minLength': 2, 'description': 'Shortest duration to include, for example "1 hour"'}, 'maxTargetPercent': {'type': 'number', 'maximum': 10000, 'minimum': 0, 'description': 'Only targets at most this far from the reference price, in percent'}, 'minTargetPercent': {'type': 'number', 'maximum': 10000, 'minimum': 0, 'description': 'Only targets at least this far from the reference price, in percent'}, 'maxDurationExclusive': {'type': 'boolean', 'description': 'true for "less than maxDuration"; default includes maxDuration'}, 'maxProbabilityPercent': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': 'Only forecasts whose probability is at most this'}, 'minProbabilityPercent': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': "Only forecasts whose probability (Kunkafa's confidence) is at least this"}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'IntegrationSelectedOutput': {'type': 'object', 'required': ['direction', 'movePercent', 'probabilityPercent'], 'properties': {'direction': {'enum': ['up', 'down']}, 'movePercent': {'type': 'number'}, 'probabilityPercent': {'type': 'number', 'maximum': 100, 'minimum': 0}}, 'description': "One target-touch forecast. probabilityPercent is Kunkafa's confidence; outputs without one are counted in counts.withoutProbability, not listed.", 'additionalProperties': False}, 'IntegrationSelectedSource': {'type': 'object', 'required': ['duration', 'sourceAt', 'referencePrice', 'outputs', 'label'], 'properties': {'label': {'type': 'string', 'pattern': '^[A-Z]$', 'description': 'Names the source within its duration (A, B, C…): forecasts made together. Sources are read side by side, never merged.'}, 'outputs': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationSelectedOutput'}, 'maxItems': 72, 'minItems': 1}, 'duration': {'type': 'string', 'minLength': 1}, 'sourceAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'forecastAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'referencePrice': {'type': 'number', 'exclusiveMinimum': 0}}, 'description': 'A source group within the selection; several can share a duration. Only groups with forecasts are listed; forecastAt is left out when unknown.', 'additionalProperties': False}, 'IntegrationOutlookSelection': {'type': 'object', 'required': ['market', 'name', 'url', 'sourceAt', 'selection', 'availableDurations', 'forecasts', 'counts'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'pattern': '^https://kunkafa\\.com/markets/[a-z0-9-]+/$'}, 'name': {'type': 'string', 'minLength': 1}, 'counts': {'type': 'object', 'required': ['forecasts', 'withoutProbability'], 'properties': {'forecasts': {'type': 'integer', 'maximum': 72, 'minimum': 0}, 'withoutProbability': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}, 'sourceAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'forecasts': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationSelectedSource'}}, 'selection': {'type': 'object', 'required': ['durations', 'direction', 'minProbabilityPercent', 'maxProbabilityPercent', 'minTargetPercent', 'maxTargetPercent'], 'properties': {'direction': {'enum': ['up', 'down', 'both']}, 'durations': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 6, 'minItems': 1}, 'maxTargetPercent': {'type': ['number', 'null']}, 'minTargetPercent': {'type': 'number'}, 'maxProbabilityPercent': {'type': 'number'}, 'minProbabilityPercent': {'type': 'number'}}, 'additionalProperties': False}, 'withoutForecasts': {'type': 'array', 'items': {'type': 'object', 'required': ['duration', 'reason'], 'properties': {'reason': {'enum': ['none_now', 'no_match']}, 'duration': {'type': 'string', 'minLength': 1}}, 'additionalProperties': False}, 'maxItems': 40, 'minItems': 1, '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.'}, 'availableDurations': {'type': 'array', 'items': {'type': 'string'}, 'maxItems': 40, 'description': 'Durations of this market that have forecasts now; a duration with none is left out.'}}, 'description': "The requested selection of one market's current forecasts. Historical performance and selected past results are read with their own operations.", 'additionalProperties': False}, 'IntegrationOutlookFieldGuide': {'type': 'object', 'required': ['probabilityPercent', 'movePercent', 'referencePrice', 'sourceAt', 'forecastAt', 'label', 'counts', 'interpretation', 'more'], 'properties': {'more': {'type': 'string'}, 'label': {'type': 'string'}, 'counts': {'type': 'string'}, 'sourceAt': {'type': 'string'}, 'forecastAt': {'type': 'string'}, 'movePercent': {'type': 'string'}, 'interpretation': {'type': 'string'}, 'referencePrice': {'type': 'string'}, 'withoutForecasts': {'type': 'string', 'minLength': 1}, 'probabilityPercent': {'type': 'string'}}, 'additionalProperties': False}}, 'required': ['data', 'fieldGuide', 'usage', 'notices', 'dataUse'], 'properties': {'data': {'$ref': '#/$defs/IntegrationOutlookSelection'}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'fieldGuide': {'$ref': '#/$defs/IntegrationOutlookFieldGuide'}}, '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.", 'additionalProperties': False}
get_performance
Past performance
How often past forecasts touched their target, by confidence level and period. Pass probabilityPercent for the matching row (headline).
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['market'], 'properties': {'market': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'maxLength': 200, 'minLength': 1, 'description': 'Market slug from list_markets, for example bitcoin'}, 'probabilityPercent': {'type': 'number', 'maximum': 100, 'minimum': 0, 'description': "A forecast's confidence; the headline shows past results at the nearest published level at or below it"}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationPerformance': {'type': 'object', 'required': ['market', 'sourceAt', 'defaultProbabilityThresholdPercent', 'periods'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'pattern': '^https://kunkafa\\.com/markets/[a-z0-9-]+/$', 'description': "The market's page on kunkafa.com."}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}, 'periods': {'type': 'array', 'items': {'type': 'object', 'required': ['period', 'points'], 'properties': {'period': {'enum': ['d1', 'd7', 'd30', 'all_time']}, 'points': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationPerformancePoint'}}}, 'additionalProperties': False}, 'maxItems': 4, 'minItems': 4}, 'sourceAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'latestReport': {'$ref': '#/$defs/IntegrationReportEvidence'}, 'defaultProbabilityThresholdPercent': {'type': 'number', 'maximum': 100, 'minimum': 0}}, '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.', 'additionalProperties': False}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'IntegrationReportShares': {'type': 'object', 'required': ['settledForecasts', 'bandsPercent'], 'properties': {'bandsPercent': {'type': 'array', 'items': {'type': 'number', 'maximum': 100, 'minimum': 0}, 'maxItems': 8, 'minItems': 8, 'description': 'Share of the settled forecasts in each band, in the order of bands; sums to 100.'}, 'settledForecasts': {'type': 'integer', 'minimum': 0}}, 'additionalProperties': False}, 'IntegrationReportEvidence': {'oneOf': [{'type': 'object', 'required': ['status', 'data'], 'properties': {'data': {'$ref': '#/$defs/IntegrationReportBreakdown'}, 'status': {'const': 'available'}}, 'additionalProperties': False}, {'type': 'object', 'required': ['status', 'data'], 'properties': {'data': {'type': 'null'}, 'status': {'const': 'unavailable'}}, 'additionalProperties': False}]}, 'IntegrationReportBreakdown': {'type': 'object', 'required': ['market', 'edition', 'window', 'generatedAt', 'reportUrl', 'bands', 'floors'], 'properties': {'bands': {'type': 'array', 'items': {'type': 'object', 'required': ['key', 'fromPct', 'toPct'], 'properties': {'key': {'type': 'string'}, 'toPct': {'type': ['number', 'null']}, 'fromPct': {'type': 'number'}}, 'additionalProperties': False}, 'maxItems': 8, 'minItems': 8}, 'floors': {'type': 'array', 'items': {'type': 'object', 'required': ['minimumProbabilityPercent', 'settledForecasts', 'bandsPercent', 'up', 'down'], 'properties': {'up': {'$ref': '#/$defs/IntegrationReportShares'}, 'down': {'$ref': '#/$defs/IntegrationReportShares'}, 'bandsPercent': {'type': 'array', 'items': {'type': 'number', 'maximum': 100, 'minimum': 0}, 'maxItems': 8, 'minItems': 8, 'description': 'Share of the settled forecasts in each band, in the order of bands; sums to 100.'}, 'settledForecasts': {'type': 'integer', 'minimum': 0}, 'minimumProbabilityPercent': {'type': 'integer', 'maximum': 100, 'minimum': 0}}, 'additionalProperties': False}, 'maxItems': 20, 'minItems': 1}, 'market': {'type': 'string'}, 'window': {'type': 'object', 'required': ['from', 'to'], 'properties': {'to': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}, 'from': {'type': 'string', 'pattern': '^\\d{4}-\\d{2}-\\d{2}$'}}, 'additionalProperties': False}, 'edition': {'const': 'full'}, 'reportUrl': {'type': 'string', 'pattern': '^https://kunkafa\\.com/reports/'}, 'generatedAt': {'type': 'string'}}, '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.", 'additionalProperties': False}, 'IntegrationPerformancePoint': {'type': 'object', 'required': ['probabilityThresholdPercent', 'sampleCount', 'targetsReachedPercent', 'status'], 'properties': {'status': {'enum': ['available', 'insufficient']}, 'sampleCount': {'type': 'integer', 'minimum': 0}, 'targetsReachedPercent': {'anyOf': [{'type': 'number', 'maximum': 100, 'minimum': 0}, {'type': 'null'}]}, 'probabilityThresholdPercent': {'type': 'number', 'maximum': 100, 'minimum': 0}}, '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.', 'additionalProperties': False}, 'IntegrationPerformanceHeadline': {'type': 'object', 'required': ['probabilityThresholdPercent', 'basis', 'periods'], 'properties': {'basis': {'enum': ['default', 'requested']}, 'periods': {'type': 'array', 'items': {'type': 'object', 'required': ['period', 'sampleCount', 'targetsReachedPercent', 'status'], 'properties': {'period': {'enum': ['d1', 'd7', 'd30', 'all_time']}, 'status': {'enum': ['available', 'insufficient']}, 'sampleCount': {'type': 'integer', 'minimum': 0}, 'targetsReachedPercent': {'anyOf': [{'type': 'number', 'maximum': 100, 'minimum': 0}, {'type': 'null'}]}}, 'additionalProperties': False}, 'maxItems': 4, 'minItems': 4}, 'probabilityThresholdPercent': {'type': 'number', 'maximum': 100, 'minimum': 0}}, '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).", 'additionalProperties': False}}, 'required': ['data', 'usage', 'notices', 'dataUse', 'fieldGuide', 'headline'], 'properties': {'data': {'allOf': [{'$ref': '#/$defs/IntegrationPerformance'}, {'required': ['url']}]}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'headline': {'$ref': '#/$defs/IntegrationPerformanceHeadline'}, 'fieldGuide': {'type': 'object', 'required': ['periods', 'probabilityThresholdPercent', 'targetsReachedPercent', 'sampleCount', 'latestReport'], 'properties': {'periods': {'type': 'string'}, 'sampleCount': {'type': 'string'}, 'latestReport': {'type': 'string'}, 'targetsReachedPercent': {'type': 'string'}, 'probabilityThresholdPercent': {'type': 'string'}}, 'description': 'Plain meanings of the returned fields.', 'additionalProperties': False}}, 'additionalProperties': False}
get_results
Past results
Recent example forecasts with their outcomes; not a full record.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['market'], 'properties': {'market': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'maxLength': 200, 'minLength': 1, 'description': 'Market slug from list_markets, for example bitcoin'}, 'durations': {'type': 'array', 'items': {'type': 'string', 'pattern': '^\\d{1,5}\\s*[A-Za-z]{1,8}$', 'maxLength': 24, 'minLength': 2}, 'maxItems': 6, 'minItems': 1, 'description': 'Only these duration labels, for example ["1 hour", "1 day"]; default every duration'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationResult': {'type': 'object', 'required': ['id', 'direction', 'predictionAt', 'closedAt', 'probabilityPercent', 'movePercent', 'outcome', 'durationLabel', 'mfePercent', 'targetProgressPercent'], 'properties': {'id': {'type': 'string', 'pattern': '^[a-f0-9]{24}$'}, 'outcome': {'enum': ['reached', 'not-reached']}, 'closedAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'direction': {'enum': ['up', 'down']}, 'mfePercent': {'type': ['number', 'null'], 'minimum': 0, 'description': 'Recorded furthest favorable price movement in percentage points.'}, 'movePercent': {'type': 'number'}, 'predictionAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'durationLabel': {'anyOf': [{'type': 'string', 'minLength': 1}, {'type': 'object', 'required': ['en', 'ar'], 'properties': {'ar': {'type': 'string'}, 'en': {'type': 'string'}}, 'additionalProperties': False}], 'description': 'English label in API and MCP replies; the app hand-off file keeps both languages.'}, 'probabilityPercent': {'type': 'number', 'maximum': 100, 'minimum': 80, '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.'}, 'targetProgressPercent': {'type': ['number', 'null'], 'minimum': 0, 'description': 'Favorable move as a percentage of target distance; can exceed 100. Missing is null.'}}, 'description': 'A selected completed result; confidence is the value recorded at prediction time, separate from aggregate performance.', 'additionalProperties': False}, 'IntegrationResults': {'type': 'object', 'required': ['market', 'sourceAt', 'results'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'pattern': '^https://kunkafa\\.com/markets/[a-z0-9-]+/$', 'description': "The market's page on kunkafa.com."}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}, 'results': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationResult'}}, 'sourceAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, '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.', 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}}, 'required': ['data', 'usage', 'notices', 'dataUse', 'fieldGuide'], 'properties': {'data': {'allOf': [{'$ref': '#/$defs/IntegrationResults'}, {'required': ['url']}]}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'fieldGuide': {'type': 'object', 'required': ['results', 'probabilityPercent', 'movePercent', 'outcome', 'mfePercent', 'targetProgressPercent'], 'properties': {'outcome': {'type': 'string'}, 'results': {'type': 'string'}, 'mfePercent': {'type': 'string'}, 'movePercent': {'type': 'string'}, 'probabilityPercent': {'type': 'string'}, 'targetProgressPercent': {'type': 'string'}}, 'description': 'Plain meanings of the returned fields.', 'additionalProperties': False}}, 'additionalProperties': False}
get_usage
Usage and limits
Remaining allowances, what one get_outlooks call returns, and this connection's permissions, canFollow and expiry. Uses no allowance.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Items per page, 1 to 50; default 50'}, 'cursor': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$', 'maxLength': 256, 'minLength': 1, 'description': 'page.nextCursor from the previous reply, to read the next page; omit for the first page'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationPage': {'type': 'object', 'required': ['total', 'returned', 'nextCursor'], 'properties': {'total': {'type': 'integer', 'minimum': 0}, 'returned': {'type': 'integer', 'maximum': 50, 'minimum': 0}, 'nextCursor': {'anyOf': [{'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$', 'maxLength': 256, 'minLength': 1}, {'type': 'null'}]}}, 'description': 'Follow nextCursor until null. Cursors are invalidated by relevant access or market-list changes; restart without a cursor.', 'additionalProperties': False}, 'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationFollowing': {'type': 'object', 'required': ['followed', 'followLimit', 'canFollowMore', 'readsEveryMarket', 'message', 'followInApp', 'otherMarkets', 'otherMarketsTotal'], 'properties': {'message': {'type': 'string', 'description': 'Plain explanation for the user, including for accounts that read every market.'}, 'followed': {'type': 'integer', 'minimum': 0, 'description': "Markets on the account's following list, as the app counts them."}, 'canFollow': {'type': 'boolean', 'description': 'Whether this connection may follow and unfollow markets.'}, 'followInApp': {'type': 'string', 'format': 'uri', 'description': 'Where the user follows markets in the Kunkafa app.'}, 'followLimit': {'type': ['integer', 'null'], 'minimum': 0, 'description': "The plan's Following count; null when the account reads every market."}, 'otherMarkets': {'type': 'array', 'items': {'type': 'object', 'required': ['market', 'name'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}}, 'additionalProperties': False}, 'maxItems': 100, '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.'}, 'canFollowMore': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'How many more markets can be followed; null when the account reads every market.'}, 'readsEveryMarket': {'type': 'boolean'}, 'otherMarketsTotal': {'type': 'integer', 'minimum': 0, 'description': 'How many catalogue markets the account does not follow.'}, 'howToAllowFollowing': {'type': 'string', 'minLength': 1, 'description': 'Present when canFollow is false.'}}, 'description': 'What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.', 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}}, 'required': ['data', 'following', 'usage', 'notices', 'page', 'dataUse'], 'properties': {'data': {'type': 'object', 'required': ['permittedMarkets', 'outlookLimits', 'connection'], 'properties': {'connection': {'type': 'object', 'required': ['kind', 'permissions', 'expiresAt', 'canFollow'], 'properties': {'kind': {'enum': ['oauth', 'personal_token']}, 'idleDays': {'const': 90}, 'canFollow': {'type': 'boolean', 'description': 'Whether this connection may follow and unfollow markets (the following:write permission).'}, 'expiresAt': {'$ref': '#/$defs/IntegrationTimestamp'}, 'permissions': {'type': 'array', 'items': {'enum': ['markets:read', 'outlooks:read', 'performance:read', 'results:read', 'usage:read', 'following:write']}, 'maxItems': 6, 'minItems': 1, 'uniqueItems': True}, 'howToAllowFollowing': {'type': 'string', 'description': 'Present only when canFollow is false: how the user allows following for this connection.'}, 'staysConnectedWhileUsed': {'const': True}}, '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.", 'additionalProperties': False}, 'outlookLimits': {'type': 'object', 'required': ['marketsPerCall', 'maxDurations', 'maxForecasts'], 'properties': {'maxDurations': {'const': 6}, 'maxForecasts': {'const': 72}, 'marketsPerCall': {'const': 1}}, 'description': 'What one get_outlooks call can return.', 'additionalProperties': False}, 'permittedMarkets': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationMarketSlug'}, 'maxItems': 50}}, 'additionalProperties': False}, 'page': {'$ref': '#/$defs/IntegrationPage'}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'following': {'$ref': '#/$defs/IntegrationFollowing'}}, 'additionalProperties': False}
list_markets
Available markets
Markets this account can read, each with the durations that have forecasts now, and what it follows. Page with page.nextCursor.
읽기 전용
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'maximum': 50, 'minimum': 1, 'description': 'Items per page, 1 to 50; default 50'}, 'cursor': {'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$', 'maxLength': 256, 'minLength': 1, 'description': 'page.nextCursor from the previous reply, to read the next page; omit for the first page'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationPage': {'type': 'object', 'required': ['total', 'returned', 'nextCursor'], 'properties': {'total': {'type': 'integer', 'minimum': 0}, 'returned': {'type': 'integer', 'maximum': 50, 'minimum': 0}, 'nextCursor': {'anyOf': [{'type': 'string', 'pattern': '^[A-Za-z0-9_-]+$', 'maxLength': 256, 'minLength': 1}, {'type': 'null'}]}}, 'description': 'Follow nextCursor until null. Cursors are invalidated by relevant access or market-list changes; restart without a cursor.', 'additionalProperties': False}, 'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationMarket': {'type': 'object', 'required': ['market', 'name', 'url', 'durations'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'pattern': '^https://kunkafa\\.com/markets/[a-z0-9-]+/$'}, 'name': {'type': 'string', 'minLength': 1}, 'note': {'type': 'string', 'minLength': 1, 'description': 'Present only when the market has no forecasts at the moment.'}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}, 'durations': {'type': 'array', 'items': {'type': 'string', 'minLength': 1}, 'maxItems': 40, '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.'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationFollowing': {'type': 'object', 'required': ['followed', 'followLimit', 'canFollowMore', 'readsEveryMarket', 'message', 'followInApp', 'otherMarkets', 'otherMarketsTotal'], 'properties': {'message': {'type': 'string', 'description': 'Plain explanation for the user, including for accounts that read every market.'}, 'followed': {'type': 'integer', 'minimum': 0, 'description': "Markets on the account's following list, as the app counts them."}, 'canFollow': {'type': 'boolean', 'description': 'Whether this connection may follow and unfollow markets.'}, 'followInApp': {'type': 'string', 'format': 'uri', 'description': 'Where the user follows markets in the Kunkafa app.'}, 'followLimit': {'type': ['integer', 'null'], 'minimum': 0, 'description': "The plan's Following count; null when the account reads every market."}, 'otherMarkets': {'type': 'array', 'items': {'type': 'object', 'required': ['market', 'name'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}}, 'additionalProperties': False}, 'maxItems': 100, '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.'}, 'canFollowMore': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'How many more markets can be followed; null when the account reads every market.'}, 'readsEveryMarket': {'type': 'boolean'}, 'otherMarketsTotal': {'type': 'integer', 'minimum': 0, 'description': 'How many catalogue markets the account does not follow.'}, 'howToAllowFollowing': {'type': 'string', 'minLength': 1, 'description': 'Present when canFollow is false.'}}, 'description': 'What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.', 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}}, 'required': ['data', 'following', 'usage', 'notices', 'page', 'dataUse'], 'properties': {'data': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationMarket'}, 'maxItems': 50}, 'page': {'$ref': '#/$defs/IntegrationPage'}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'following': {'$ref': '#/$defs/IntegrationFollowing'}}, 'additionalProperties': False}
unfollow_market
Unfollow a market
Stop following a market; its data stops being readable. Check canFollow in get_usage first.
파괴적 작업 멱등성
입력 스키마
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['market'], 'properties': {'market': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'maxLength': 200, 'minLength': 1, 'description': 'Market slug from list_markets, for example bitcoin'}}, 'additionalProperties': False}
출력 스키마
{'type': 'object', '$defs': {'IntegrationUsage': {'type': 'object', 'required': ['calculatedAt', 'tier', 'requests', 'concurrency', 'windows'], 'properties': {'tier': {'enum': ['free', 'starter', 'core', 'pro', 'publisher']}, 'windows': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationWindowUsage'}, 'maxItems': 3, 'minItems': 3}, 'requests': {'type': 'object', 'required': ['perMinute', 'burst', 'remaining', 'nextRequestAt'], 'properties': {'burst': {'type': 'integer', 'minimum': 0}, 'perMinute': {'type': 'integer', 'minimum': 0}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'description': 'Steady request rate with bounded burst capacity; metadata and repeated summaries still count toward request protection.', 'additionalProperties': False}, 'adjustment': {'type': 'object', 'required': ['expiresAt'], 'properties': {'expiresAt': {'type': ['string', 'null'], 'format': 'date-time'}}, '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.', 'additionalProperties': False}, 'concurrency': {'type': 'object', 'required': ['limit', 'remaining', 'nextRequestAt'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1}, 'remaining': {'type': 'integer', 'maximum': 100, 'minimum': 0}, 'nextRequestAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'calculatedAt': {'$ref': '#/$defs/IntegrationTimestamp'}}, 'additionalProperties': False}, 'IntegrationNotice': {'type': 'object', 'required': ['id', 'period', 'kind', 'message', 'used', 'limit', 'remaining', 'nextCapacityAt'], 'properties': {'id': {'type': 'string'}, 'kind': {'enum': ['approaching_limit', 'limit_reached']}, 'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'period': {'enum': ['day', 'week', 'month']}, 'message': {'type': 'string'}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, 'additionalProperties': False}, 'IntegrationFollowing': {'type': 'object', 'required': ['followed', 'followLimit', 'canFollowMore', 'readsEveryMarket', 'message', 'followInApp', 'otherMarkets', 'otherMarketsTotal'], 'properties': {'message': {'type': 'string', 'description': 'Plain explanation for the user, including for accounts that read every market.'}, 'followed': {'type': 'integer', 'minimum': 0, 'description': "Markets on the account's following list, as the app counts them."}, 'canFollow': {'type': 'boolean', 'description': 'Whether this connection may follow and unfollow markets.'}, 'followInApp': {'type': 'string', 'format': 'uri', 'description': 'Where the user follows markets in the Kunkafa app.'}, 'followLimit': {'type': ['integer', 'null'], 'minimum': 0, 'description': "The plan's Following count; null when the account reads every market."}, 'otherMarkets': {'type': 'array', 'items': {'type': 'object', 'required': ['market', 'name'], 'properties': {'name': {'type': 'string', 'minLength': 1}, 'market': {'$ref': '#/$defs/IntegrationMarketSlug'}}, 'additionalProperties': False}, 'maxItems': 100, '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.'}, 'canFollowMore': {'type': ['integer', 'null'], 'minimum': 0, 'description': 'How many more markets can be followed; null when the account reads every market.'}, 'readsEveryMarket': {'type': 'boolean'}, 'otherMarketsTotal': {'type': 'integer', 'minimum': 0, 'description': 'How many catalogue markets the account does not follow.'}, 'howToAllowFollowing': {'type': 'string', 'minLength': 1, 'description': 'Present when canFollow is false.'}}, 'description': 'What the account follows and can still follow. Following decides which markets can be read; it happens in the Kunkafa app.', 'additionalProperties': False}, 'IntegrationTimestamp': {'type': 'string', 'format': 'date-time', 'description': 'ISO 8601 UTC timestamp supplied by Kunkafa.'}, 'IntegrationMarketSlug': {'type': 'string', 'pattern': '^[a-z0-9]+(?:-[a-z0-9]+)*$', 'description': 'Published English-name market slug returned by authorized discovery.'}, 'IntegrationWindowUsage': {'type': 'object', 'required': ['period', 'used', 'limit', 'remaining', 'nextCapacityAt', 'notice', 'noticeId'], 'properties': {'used': {'type': 'integer', 'minimum': 0}, 'limit': {'type': 'integer', 'minimum': 0}, 'notice': {'enum': ['approaching_limit', 'limit_reached', None]}, 'period': {'enum': ['day', 'week', 'month']}, 'noticeId': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'remaining': {'type': 'integer', 'minimum': 0}, 'nextCapacityAt': {'anyOf': [{'$ref': '#/$defs/IntegrationTimestamp'}, {'type': 'null'}]}}, '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.', 'additionalProperties': False}, 'IntegrationFollowingChange': {'type': 'object', 'required': ['market', 'action', 'nextChangeAllowedAt'], '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.'}}, 'additionalProperties': False}}, 'required': ['data', 'following', 'usage', 'notices', 'dataUse'], 'properties': {'data': {'$ref': '#/$defs/IntegrationFollowingChange'}, 'usage': {'$ref': '#/$defs/IntegrationUsage'}, 'dataUse': {'type': 'string', '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.'}, 'notices': {'type': 'array', 'items': {'$ref': '#/$defs/IntegrationNotice'}, 'maxItems': 3}, 'following': {'$ref': '#/$defs/IntegrationFollowing'}}, 'description': "The change and the account's following after it. The Kunkafa app shows the same list immediately.", 'additionalProperties': False}
추가됨
get_account_links
2026년 10월 4일 2:40 AM
추가됨
get_glossary
2026년 10월 4일 2:40 AM
추가됨
unfollow_market
2026년 10월 4일 2:40 AM
추가됨
follow_market
2026년 10월 4일 2:40 AM
추가됨
get_usage
2026년 10월 4일 2:40 AM
추가됨
get_results
2026년 10월 4일 2:40 AM
추가됨
get_performance
2026년 10월 4일 2:40 AM
추가됨
get_outlooks
2026년 10월 4일 2:40 AM
추가됨
list_markets
2026년 10월 4일 2:40 AM