kaito-mcp-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +104 -0
  2. package/build/client.d.ts +8 -0
  3. package/build/client.d.ts.map +1 -0
  4. package/build/client.js +39 -0
  5. package/build/client.js.map +1 -0
  6. package/build/index.d.ts +3 -0
  7. package/build/index.d.ts.map +1 -0
  8. package/build/index.js +13 -0
  9. package/build/index.js.map +1 -0
  10. package/build/prompts/workflows.d.ts +3 -0
  11. package/build/prompts/workflows.d.ts.map +1 -0
  12. package/build/prompts/workflows.js +68 -0
  13. package/build/prompts/workflows.js.map +1 -0
  14. package/build/resources/reference.d.ts +4 -0
  15. package/build/resources/reference.d.ts.map +1 -0
  16. package/build/resources/reference.js +33 -0
  17. package/build/resources/reference.js.map +1 -0
  18. package/build/server.d.ts +3 -0
  19. package/build/server.d.ts.map +1 -0
  20. package/build/server.js +28 -0
  21. package/build/server.js.map +1 -0
  22. package/build/tools/events.d.ts +4 -0
  23. package/build/tools/events.d.ts.map +1 -0
  24. package/build/tools/events.js +64 -0
  25. package/build/tools/events.js.map +1 -0
  26. package/build/tools/market-data.d.ts +4 -0
  27. package/build/tools/market-data.d.ts.map +1 -0
  28. package/build/tools/market-data.js +132 -0
  29. package/build/tools/market-data.js.map +1 -0
  30. package/build/tools/rankings.d.ts +4 -0
  31. package/build/tools/rankings.d.ts.map +1 -0
  32. package/build/tools/rankings.js +65 -0
  33. package/build/tools/rankings.js.map +1 -0
  34. package/build/tools/search.d.ts +4 -0
  35. package/build/tools/search.d.ts.map +1 -0
  36. package/build/tools/search.js +131 -0
  37. package/build/tools/search.js.map +1 -0
  38. package/build/tools/social.d.ts +4 -0
  39. package/build/tools/social.d.ts.map +1 -0
  40. package/build/tools/social.js +71 -0
  41. package/build/tools/social.js.map +1 -0
  42. package/package.json +26 -0
package/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # kaito-mcp-server
2
+
3
+ MCP server for [Kaito AI](https://kaito.ai) crypto market intelligence API. Provides 13 tools, 2 resources, and 2 prompt templates for accessing Kaito's sentiment analysis, mindshare tracking, social intelligence, and more.
4
+
5
+ ## Quick Start
6
+
7
+ ### Claude Desktop
8
+
9
+ Add to your `claude_desktop_config.json`:
10
+
11
+ ```jsonc
12
+ {
13
+ "mcpServers": {
14
+ "kaito": {
15
+ "command": "npx",
16
+ "args": ["-y", "kaito-mcp-server"],
17
+ "env": {
18
+ "KAITO_API_KEY": "your-api-key"
19
+ }
20
+ }
21
+ }
22
+ }
23
+ ```
24
+
25
+ ### Claude Code
26
+
27
+ ```bash
28
+ claude mcp add kaito -- npx -y kaito-mcp-server
29
+ ```
30
+
31
+ Set the environment variable `KAITO_API_KEY` before launching.
32
+
33
+ ## Tools
34
+
35
+ ### Market Data
36
+
37
+ | Tool | Description |
38
+ |------|-------------|
39
+ | `kaito_sentiment` | Daily sentiment time series for a token |
40
+ | `kaito_mindshare` | Daily mindshare time series for a token |
41
+ | `kaito_narrative_mindshare` | Daily mindshare for a crypto narrative |
42
+ | `kaito_mentions` | Daily mention counts by source |
43
+ | `kaito_engagement` | Daily engagement metrics (total + smart) |
44
+
45
+ ### Search
46
+
47
+ | Tool | Description |
48
+ |------|-------------|
49
+ | `kaito_advanced_search` | Ranked crypto feeds with AI summaries and filters |
50
+
51
+ ### Social
52
+
53
+ | Tool | Description |
54
+ |------|-------------|
55
+ | `kaito_smart_followers` | Smart follower count or list for a user |
56
+ | `kaito_smart_following` | Latest 100 smart accounts followed by a user |
57
+ | `kaito_reciprocal_followers` | Mutual followers sorted by smart follower count |
58
+
59
+ ### Rankings
60
+
61
+ | Tool | Description |
62
+ |------|-------------|
63
+ | `kaito_mindshare_arena` | Project rankings by mindshare |
64
+ | `kaito_pre_tge_arena` | Pre-TGE project rankings by mindshare |
65
+
66
+ ### Events
67
+
68
+ | Tool | Description |
69
+ |------|-------------|
70
+ | `kaito_events` | Upcoming catalyst events for a token |
71
+ | `kaito_tweet_engagement_info` | Engagement details for a specific tweet |
72
+
73
+ ## Resources
74
+
75
+ | Resource | URI | Description |
76
+ |----------|-----|-------------|
77
+ | Tokens | `kaito://tokens` | All supported token tickers (no auth required) |
78
+ | Narratives | `kaito://narratives` | All supported narrative IDs (no auth required) |
79
+
80
+ ## Prompt Templates
81
+
82
+ | Prompt | Description |
83
+ |--------|-------------|
84
+ | `analyze_token` | Comprehensive token analysis workflow (sentiment → mindshare → mentions → engagement → events → search) |
85
+ | `discover_trending` | Trending discovery workflow (mindshare arena → pre-TGE arena → search) |
86
+
87
+ ## Development
88
+
89
+ ```bash
90
+ git clone https://github.com/MetaSearch-IO/kaito-mcp-server.git
91
+ cd kaito-mcp-server
92
+ npm install
93
+ npm run build
94
+ ```
95
+
96
+ Test with the MCP Inspector:
97
+
98
+ ```bash
99
+ KAITO_API_KEY=your-key npx @modelcontextprotocol/inspector node build/index.js
100
+ ```
101
+
102
+ ## License
103
+
104
+ MIT
@@ -0,0 +1,8 @@
1
+ export declare class KaitoClient {
2
+ private apiKey;
3
+ constructor();
4
+ request(endpoint: string, params: Record<string, string | undefined>, options?: {
5
+ requireAuth?: boolean;
6
+ }): Promise<unknown>;
7
+ }
8
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAIA,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAqB;;IAM7B,OAAO,CACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAC1C,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAClC,OAAO,CAAC,OAAO,CAAC;CAgDpB"}
@@ -0,0 +1,39 @@
1
+ import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
2
+ const BASE_URL = "https://api.kaito.ai/api/v1";
3
+ export class KaitoClient {
4
+ apiKey;
5
+ constructor() {
6
+ this.apiKey = process.env.KAITO_API_KEY;
7
+ }
8
+ async request(endpoint, params, options) {
9
+ const requireAuth = options?.requireAuth ?? true;
10
+ if (requireAuth && !this.apiKey) {
11
+ throw new McpError(ErrorCode.InvalidRequest, "KAITO_API_KEY environment variable is not set. Please configure it to use this tool.");
12
+ }
13
+ const url = new URL(`${BASE_URL}/${endpoint}`);
14
+ for (const [key, value] of Object.entries(params)) {
15
+ if (value !== undefined) {
16
+ url.searchParams.set(key, value);
17
+ }
18
+ }
19
+ const headers = {};
20
+ if (this.apiKey) {
21
+ headers["x-api-key"] = this.apiKey;
22
+ }
23
+ const response = await fetch(url.toString(), { headers });
24
+ if (!response.ok) {
25
+ const body = await response.text().catch(() => "");
26
+ switch (response.status) {
27
+ case 401:
28
+ case 403:
29
+ throw new McpError(ErrorCode.InvalidRequest, `Authentication failed (${response.status}): ${body || "Invalid API key"}`);
30
+ case 429:
31
+ throw new McpError(ErrorCode.InvalidRequest, `Rate limit exceeded. Kaito API allows 5 requests/second. ${body}`);
32
+ default:
33
+ throw new McpError(ErrorCode.InternalError, `Kaito API error ${response.status}: ${body || response.statusText}`);
34
+ }
35
+ }
36
+ return response.json();
37
+ }
38
+ }
39
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,QAAQ,GAAG,6BAA6B,CAAC;AAE/C,MAAM,OAAO,WAAW;IACd,MAAM,CAAqB;IAEnC;QACE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,OAAO,CACX,QAAgB,EAChB,MAA0C,EAC1C,OAAmC;QAEnC,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,IAAI,CAAC;QAEjD,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,cAAc,EACxB,sFAAsF,CACvF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACrC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACxB,KAAK,GAAG,CAAC;gBACT,KAAK,GAAG;oBACN,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,cAAc,EACxB,0BAA0B,QAAQ,CAAC,MAAM,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAC3E,CAAC;gBACJ,KAAK,GAAG;oBACN,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,cAAc,EACxB,4DAA4D,IAAI,EAAE,CACnE,CAAC;gBACJ;oBACE,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,mBAAmB,QAAQ,CAAC,MAAM,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE,CACrE,CAAC;YACN,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/build/index.js ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ async function main() {
5
+ const server = createServer();
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ }
9
+ main().catch((error) => {
10
+ console.error("Fatal error:", error);
11
+ process.exit(1);
12
+ });
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPrompts(server: McpServer): void;
3
+ //# sourceMappingURL=workflows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../src/prompts/workflows.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QA4EhD"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ export function registerPrompts(server) {
3
+ server.prompt("analyze_token", "Comprehensive analysis of a crypto token: sentiment, mindshare, mentions, engagement, events, and recent news.", {
4
+ token: z.string().describe("Token ticker (e.g. BTC, ETH)"),
5
+ days: z
6
+ .string()
7
+ .optional()
8
+ .describe("Number of days to look back (default: 30)"),
9
+ }, ({ token, days }) => {
10
+ const lookback = days || "30";
11
+ return {
12
+ messages: [
13
+ {
14
+ role: "user",
15
+ content: {
16
+ type: "text",
17
+ text: `Perform a comprehensive analysis of the crypto token "${token}" over the last ${lookback} days. Follow these steps in order:
18
+
19
+ 1. **Sentiment**: Call kaito_sentiment for ${token} to understand market sentiment trends.
20
+ 2. **Mindshare**: Call kaito_mindshare for ${token} to see its share of crypto Twitter conversation.
21
+ 3. **Mentions**: Call kaito_mentions for ${token} to track mention volume across sources.
22
+ 4. **Engagement**: Call kaito_engagement for ${token} to measure total and smart engagement.
23
+ 5. **Events**: Call kaito_events for ${token} to find upcoming catalysts.
24
+ 6. **News & Discussion**: Call kaito_advanced_search with tokens=${token} to find the most relevant recent content.
25
+
26
+ After gathering all data, provide a structured analysis covering:
27
+ - Overall sentiment trend (bullish/bearish/neutral)
28
+ - Mindshare trajectory (growing/declining/stable)
29
+ - Key events and catalysts ahead
30
+ - Notable discussions and news
31
+ - Summary assessment with key takeaways`,
32
+ },
33
+ },
34
+ ],
35
+ };
36
+ });
37
+ server.prompt("discover_trending", "Discover trending crypto projects and narratives using mindshare rankings and recent content.", {
38
+ duration: z
39
+ .string()
40
+ .optional()
41
+ .describe("Time window for rankings: 24h, 7d, 30d (default: 24h)"),
42
+ }, ({ duration }) => {
43
+ const window = duration || "24h";
44
+ return {
45
+ messages: [
46
+ {
47
+ role: "user",
48
+ content: {
49
+ type: "text",
50
+ text: `Discover what's trending in crypto right now using a ${window} time window. Follow these steps:
51
+
52
+ 1. **Mindshare Arena**: Call kaito_mindshare_arena with duration=${window} to see top projects by mindshare.
53
+ 2. **Pre-TGE Arena**: Call kaito_pre_tge_arena with window=${window} to find trending pre-token projects.
54
+ 3. **Trending Content**: Call kaito_advanced_search in discovery mode (no tokens/keyword) to see what's trending.
55
+
56
+ After gathering all data, provide:
57
+ - Top 10 projects by mindshare with their scores
58
+ - Notable Pre-TGE projects gaining attention
59
+ - Key trending topics and discussions
60
+ - Any emerging narratives or themes
61
+ - Summary of the current market mood`,
62
+ },
63
+ },
64
+ ],
65
+ };
66
+ });
67
+ }
68
+ //# sourceMappingURL=workflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../../src/prompts/workflows.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,UAAU,eAAe,CAAC,MAAiB;IAC/C,MAAM,CAAC,MAAM,CACX,eAAe,EACf,gHAAgH,EAChH;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC1D,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;KACzD,EACD,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE;QAClB,MAAM,QAAQ,GAAG,IAAI,IAAI,IAAI,CAAC;QAC9B,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,yDAAyD,KAAK,mBAAmB,QAAQ;;6CAEhE,KAAK;6CACL,KAAK;2CACP,KAAK;+CACD,KAAK;uCACb,KAAK;mEACuB,KAAK;;;;;;;wCAOhC;qBAC3B;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,MAAM,CACX,mBAAmB,EACnB,+FAA+F,EAC/F;QACE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,uDAAuD,CAAC;KACrE,EACD,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QACf,MAAM,MAAM,GAAG,QAAQ,IAAI,KAAK,CAAC;QACjC,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,wDAAwD,MAAM;;mEAEf,MAAM;6DACZ,MAAM;;;;;;;;qCAQ9B;qBACxB;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerResources(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/resources/reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAgDvE"}
@@ -0,0 +1,33 @@
1
+ export function registerResources(server, client) {
2
+ server.resource("tokens", "kaito://tokens", {
3
+ description: "List of all supported token tickers on Kaito. Use these values for the 'token' parameter in market data tools.",
4
+ mimeType: "application/json",
5
+ }, async () => {
6
+ const data = await client.request("tokens", {}, { requireAuth: false });
7
+ return {
8
+ contents: [
9
+ {
10
+ uri: "kaito://tokens",
11
+ mimeType: "application/json",
12
+ text: JSON.stringify(data, null, 2),
13
+ },
14
+ ],
15
+ };
16
+ });
17
+ server.resource("narratives", "kaito://narratives", {
18
+ description: "List of all supported crypto narrative IDs on Kaito. Use these values for the 'narrative' parameter in kaito_narrative_mindshare.",
19
+ mimeType: "application/json",
20
+ }, async () => {
21
+ const data = await client.request("narratives", {}, { requireAuth: false });
22
+ return {
23
+ contents: [
24
+ {
25
+ uri: "kaito://narratives",
26
+ mimeType: "application/json",
27
+ text: JSON.stringify(data, null, 2),
28
+ },
29
+ ],
30
+ };
31
+ });
32
+ }
33
+ //# sourceMappingURL=reference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.js","sourceRoot":"","sources":["../../src/resources/reference.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAmB;IACtE,MAAM,CAAC,QAAQ,CACb,QAAQ,EACR,gBAAgB,EAChB;QACE,WAAW,EACT,gHAAgH;QAClH,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QACxE,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,gBAAgB;oBACrB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,QAAQ,CACb,YAAY,EACZ,oBAAoB,EACpB;QACE,WAAW,EACT,mIAAmI;QACrI,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAC/B,YAAY,EACZ,EAAE,EACF,EAAE,WAAW,EAAE,KAAK,EAAE,CACvB,CAAC;QACF,OAAO;YACL,QAAQ,EAAE;gBACR;oBACE,GAAG,EAAE,oBAAoB;oBACzB,QAAQ,EAAE,kBAAkB;oBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;iBACpC;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): McpServer;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,YAAY,IAAI,SAAS,CAsBxC"}
@@ -0,0 +1,28 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "./client.js";
3
+ import { registerMarketDataTools } from "./tools/market-data.js";
4
+ import { registerSearchTools } from "./tools/search.js";
5
+ import { registerSocialTools } from "./tools/social.js";
6
+ import { registerRankingsTools } from "./tools/rankings.js";
7
+ import { registerEventsTools } from "./tools/events.js";
8
+ import { registerResources } from "./resources/reference.js";
9
+ import { registerPrompts } from "./prompts/workflows.js";
10
+ export function createServer() {
11
+ const server = new McpServer({
12
+ name: "kaito",
13
+ version: "0.1.0",
14
+ });
15
+ const client = new KaitoClient();
16
+ // 13 Tools
17
+ registerMarketDataTools(server, client);
18
+ registerSearchTools(server, client);
19
+ registerSocialTools(server, client);
20
+ registerRankingsTools(server, client);
21
+ registerEventsTools(server, client);
22
+ // 2 Resources
23
+ registerResources(server, client);
24
+ // 2 Prompts
25
+ registerPrompts(server);
26
+ return server;
27
+ }
28
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;IAEjC,WAAW;IACX,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qBAAqB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC,cAAc;IACd,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAElC,YAAY;IACZ,eAAe,CAAC,MAAM,CAAC,CAAC;IAExB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerEventsTools(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/tools/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAO3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAoFzE"}
@@ -0,0 +1,64 @@
1
+ import { z } from "zod";
2
+ const TOOL_ANNOTATIONS = {
3
+ readOnlyHint: true,
4
+ openWorldHint: true,
5
+ };
6
+ export function registerEventsTools(server, client) {
7
+ server.tool("kaito_events", "Get upcoming catalyst events for a token, with filtering by event type, source, and date range. Use the tokens resource to find valid tickers.", {
8
+ token: z.string().describe("Token ticker (e.g. BTC, ETH)"),
9
+ start_date: z
10
+ .string()
11
+ .optional()
12
+ .describe("Filter events starting on or after this date YYYY-MM-DD"),
13
+ end_date: z
14
+ .string()
15
+ .optional()
16
+ .describe("Filter events starting on or before this date YYYY-MM-DD"),
17
+ min_announcement_date: z
18
+ .string()
19
+ .optional()
20
+ .describe("Announcement date lower bound YYYY-MM-DD"),
21
+ max_announcement_date: z
22
+ .string()
23
+ .optional()
24
+ .describe("Announcement date upper bound YYYY-MM-DD"),
25
+ event_types: z
26
+ .string()
27
+ .optional()
28
+ .describe("Comma-separated event types: Mainnet Release, Testnet Release, Roadmap Update, Token Generation Event, Conference Attendance, Proposal and Voting, Tokenomics Update, Token Unlock, Others"),
29
+ sources: z
30
+ .string()
31
+ .optional()
32
+ .describe("Comma-separated sources: Twitter Space, Twitter, Podcast, Conference, Vote, Governance, DefiLlama, Token Unlocks"),
33
+ sort_by: z
34
+ .enum(["event_date", "project_name", "market_cap", "announcement_date"])
35
+ .optional()
36
+ .describe("Sort field"),
37
+ sort_order: z
38
+ .enum(["asc", "desc"])
39
+ .optional()
40
+ .describe("Sort order"),
41
+ }, TOOL_ANNOTATIONS, async ({ token, start_date, end_date, min_announcement_date, max_announcement_date, event_types, sources, sort_by, sort_order, }) => {
42
+ const data = await client.request("events", {
43
+ token,
44
+ start_date,
45
+ end_date,
46
+ min_announcement_date,
47
+ max_announcement_date,
48
+ event_types,
49
+ sources,
50
+ sort_by,
51
+ sort_order,
52
+ });
53
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
54
+ });
55
+ server.tool("kaito_tweet_engagement_info", "Get detailed engagement metrics for a specific tweet including likes, retweets, replies, views, and smart engagement count.", {
56
+ tweet_id: z.string().describe("Twitter tweet ID (numeric string)"),
57
+ }, TOOL_ANNOTATIONS, async ({ tweet_id }) => {
58
+ const data = await client.request("tweet_engagement_info", {
59
+ tweet_id,
60
+ });
61
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
62
+ });
63
+ }
64
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/tools/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,gBAAgB,GAAG;IACvB,YAAY,EAAE,IAAI;IAClB,aAAa,EAAE,IAAI;CACX,CAAC;AAEX,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAmB;IACxE,MAAM,CAAC,IAAI,CACT,cAAc,EACd,gJAAgJ,EAChJ;QACE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC1D,UAAU,EAAE,CAAC;aACV,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yDAAyD,CAAC;QACtE,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0DAA0D,CAAC;QACvE,qBAAqB,EAAE,CAAC;aACrB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,qBAAqB,EAAE,CAAC;aACrB,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,WAAW,EAAE,CAAC;aACX,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,4LAA4L,CAC7L;QACH,OAAO,EAAE,CAAC;aACP,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,kHAAkH,CACnH;QACH,OAAO,EAAE,CAAC;aACP,IAAI,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAC;aACvE,QAAQ,EAAE;aACV,QAAQ,CAAC,YAAY,CAAC;QACzB,UAAU,EAAE,CAAC;aACV,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;aACrB,QAAQ,EAAE;aACV,QAAQ,CAAC,YAAY,CAAC;KAC1B,EACD,gBAAgB,EAChB,KAAK,EAAE,EACL,KAAK,EACL,UAAU,EACV,QAAQ,EACR,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EACX,OAAO,EACP,OAAO,EACP,UAAU,GACX,EAAE,EAAE;QACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1C,KAAK;YACL,UAAU;YACV,QAAQ;YACR,qBAAqB;YACrB,qBAAqB;YACrB,WAAW;YACX,OAAO;YACP,OAAO;YACP,UAAU;SACX,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,6BAA6B,EAC7B,6HAA6H,EAC7H;QACE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;KACnE,EACD,gBAAgB,EAChB,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACrB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzD,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9E,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerMarketDataTools(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=market-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.d.ts","sourceRoot":"","sources":["../../src/tools/market-data.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAO3C,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,WAAW,QAgKpB"}
@@ -0,0 +1,132 @@
1
+ import { z } from "zod";
2
+ const TOOL_ANNOTATIONS = {
3
+ readOnlyHint: true,
4
+ openWorldHint: true,
5
+ };
6
+ export function registerMarketDataTools(server, client) {
7
+ server.tool("kaito_sentiment", "Get daily sentiment time series for a crypto token. Returns volume-weighted bullish/bearish scores and notable events. Use the tokens resource to find valid tickers.", {
8
+ token: z.string().describe("Token ticker (e.g. BTC, ETH)"),
9
+ start_date: z
10
+ .string()
11
+ .optional()
12
+ .describe("Start date YYYY-MM-DD (default: 30 days ago, earliest: 2020-01-01)"),
13
+ end_date: z
14
+ .string()
15
+ .optional()
16
+ .describe("End date YYYY-MM-DD (default: tomorrow)"),
17
+ adjusted: z
18
+ .boolean()
19
+ .optional()
20
+ .describe("Include replies/quotes, exclude org accounts, weight by smart engagement (default: true)"),
21
+ average: z
22
+ .boolean()
23
+ .optional()
24
+ .describe("Return average sentiment -1 to +1 instead of absolute volume-weighted (default: false)"),
25
+ gaussian: z
26
+ .boolean()
27
+ .optional()
28
+ .describe("Apply Gaussian smoothing (default: true)"),
29
+ language: z
30
+ .enum(["all", "en", "zh", "ko", "others"])
31
+ .optional()
32
+ .describe("Language filter (default: all)"),
33
+ version: z
34
+ .enum(["2", "3"])
35
+ .optional()
36
+ .describe("Sentiment model version (default: 3)"),
37
+ }, TOOL_ANNOTATIONS, async ({ token, start_date, end_date, adjusted, average, gaussian, language, version }) => {
38
+ const data = await client.request("sentiment", {
39
+ token,
40
+ start_date,
41
+ end_date,
42
+ adjusted: adjusted?.toString(),
43
+ average: average?.toString(),
44
+ gaussian: gaussian?.toString(),
45
+ language,
46
+ version,
47
+ });
48
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
49
+ });
50
+ server.tool("kaito_mindshare", "Get daily mindshare time series for a crypto token. Mindshare = proportion of crypto Twitter conversation about this token. Use the tokens resource to find valid tickers.", {
51
+ token: z.string().describe("Token ticker (e.g. BTC, ETH)"),
52
+ start_date: z
53
+ .string()
54
+ .optional()
55
+ .describe("Start date YYYY-MM-DD (default: 30 days ago, earliest: 2020-01-01)"),
56
+ end_date: z
57
+ .string()
58
+ .optional()
59
+ .describe("End date YYYY-MM-DD (default: tomorrow)"),
60
+ scope: z
61
+ .string()
62
+ .optional()
63
+ .describe("Set to 'pretge' to filter for Pre-TGE projects only"),
64
+ }, TOOL_ANNOTATIONS, async ({ token, start_date, end_date, scope }) => {
65
+ const data = await client.request("mindshare", {
66
+ token,
67
+ start_date,
68
+ end_date,
69
+ scope,
70
+ });
71
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
72
+ });
73
+ server.tool("kaito_narrative_mindshare", "Get daily mindshare time series for a crypto narrative (e.g. AI, DeFi, L2). Use the narratives resource to find valid narrative IDs.", {
74
+ narrative: z.string().describe("Narrative ID (e.g. AI, DeFi). See narratives resource."),
75
+ start_date: z
76
+ .string()
77
+ .optional()
78
+ .describe("Start date YYYY-MM-DD (default: 30 days ago, earliest: 2023-01-01)"),
79
+ end_date: z
80
+ .string()
81
+ .optional()
82
+ .describe("End date YYYY-MM-DD (default: tomorrow)"),
83
+ }, TOOL_ANNOTATIONS, async ({ narrative, start_date, end_date }) => {
84
+ const data = await client.request("narrative_mindshare", {
85
+ narrative,
86
+ start_date,
87
+ end_date,
88
+ });
89
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
90
+ });
91
+ server.tool("kaito_mentions", "Get daily mention counts for a token or keyword, broken down by source (Twitter, Discord, News, etc.).", {
92
+ token: z.string().optional().describe("Token ticker (e.g. BTC, ETH)"),
93
+ keyword: z.string().optional().describe("Search keyword"),
94
+ start_date: z
95
+ .string()
96
+ .optional()
97
+ .describe("Start date YYYY-MM-DD (earliest: 2023-01-01)"),
98
+ end_date: z
99
+ .string()
100
+ .optional()
101
+ .describe("End date YYYY-MM-DD (default: today)"),
102
+ }, TOOL_ANNOTATIONS, async ({ token, keyword, start_date, end_date }) => {
103
+ const data = await client.request("mentions", {
104
+ token,
105
+ keyword,
106
+ start_date,
107
+ end_date,
108
+ });
109
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
110
+ });
111
+ server.tool("kaito_engagement", "Get daily engagement metrics (total + smart/KOL engagement) for a token or keyword.", {
112
+ token: z.string().optional().describe("Token ticker (e.g. BTC, ETH)"),
113
+ keyword: z.string().optional().describe("Search keyword"),
114
+ start_date: z
115
+ .string()
116
+ .optional()
117
+ .describe("Start date YYYY-MM-DD (earliest: 2023-01-01)"),
118
+ end_date: z
119
+ .string()
120
+ .optional()
121
+ .describe("End date YYYY-MM-DD (default: today)"),
122
+ }, TOOL_ANNOTATIONS, async ({ token, keyword, start_date, end_date }) => {
123
+ const data = await client.request("engagement", {
124
+ token,
125
+ keyword,
126
+ start_date,
127
+ end_date,
128
+ });
129
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
130
+ });
131
+ }
132
+ //# sourceMappingURL=market-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market-data.js","sourceRoot":"","sources":["../../src/tools/market-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerRankingsTools(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=rankings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rankings.d.ts","sourceRoot":"","sources":["../../src/tools/rankings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAO3C,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAuE3E"}
@@ -0,0 +1,65 @@
1
+ import { z } from "zod";
2
+ const TOOL_ANNOTATIONS = {
3
+ readOnlyHint: true,
4
+ openWorldHint: true,
5
+ };
6
+ export function registerRankingsTools(server, client) {
7
+ server.tool("kaito_mindshare_arena", "Get project rankings by mindshare score, with optional category and time window filters. Returns up to 100 projects sorted by mindshare.", {
8
+ duration: z
9
+ .enum(["all", "24h", "48h", "7d", "30d", "3m", "6m", "12m"])
10
+ .optional()
11
+ .describe("Time window (default: 24h)"),
12
+ language: z
13
+ .enum(["all", "en", "zh", "ko", "others"])
14
+ .optional()
15
+ .describe("Language filter (default: all)"),
16
+ categories: z
17
+ .string()
18
+ .optional()
19
+ .describe("Comma-separated categories (e.g. L1,DEFI). Case-insensitive."),
20
+ pre_tge: z
21
+ .boolean()
22
+ .optional()
23
+ .describe("Set true to filter Pre-TGE projects"),
24
+ ex_official: z
25
+ .boolean()
26
+ .optional()
27
+ .describe("Exclude official project accounts (default: false)"),
28
+ weighted: z
29
+ .boolean()
30
+ .optional()
31
+ .describe("Weight by smart engagement (default: true)"),
32
+ nft: z
33
+ .boolean()
34
+ .optional()
35
+ .describe("Include NFT projects (default: false)"),
36
+ }, TOOL_ANNOTATIONS, async ({ duration, language, categories, pre_tge, ex_official, weighted, nft }) => {
37
+ const data = await client.request("mindshare_arena", {
38
+ duration,
39
+ language,
40
+ categories,
41
+ pre_tge: pre_tge?.toString(),
42
+ ex_official: ex_official?.toString(),
43
+ weighted: weighted?.toString(),
44
+ nft: nft?.toString(),
45
+ });
46
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
47
+ });
48
+ server.tool("kaito_pre_tge_arena", "Get Pre-TGE (pre-token generation event) project rankings by mindshare. Returns up to 100 projects.", {
49
+ window: z
50
+ .enum(["all", "24h", "48h", "7d", "30d", "3m", "6m", "12m"])
51
+ .optional()
52
+ .describe("Time window (default: 24h)"),
53
+ language: z
54
+ .enum(["all", "en", "zh", "others"])
55
+ .optional()
56
+ .describe("Language filter (default: all)"),
57
+ }, TOOL_ANNOTATIONS, async ({ window, language }) => {
58
+ const data = await client.request("pre_tge_arena", {
59
+ window,
60
+ language,
61
+ });
62
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
63
+ });
64
+ }
65
+ //# sourceMappingURL=rankings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rankings.js","sourceRoot":"","sources":["../../src/tools/rankings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerSearchTools(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAsIzE"}
@@ -0,0 +1,131 @@
1
+ import { z } from "zod";
2
+ export function registerSearchTools(server, client) {
3
+ server.tool("kaito_advanced_search", "Search ranked crypto feeds (Twitter & News) with AI summaries, sentiment scores, and extensive filters. Omit tokens/keyword/usernames for discovery mode (trending content).", {
4
+ tokens: z
5
+ .string()
6
+ .optional()
7
+ .describe("Comma-separated token tickers (e.g. BTC,ETH)"),
8
+ keyword: z.string().optional().describe("Search keyword"),
9
+ usernames: z
10
+ .string()
11
+ .optional()
12
+ .describe("Comma-separated Twitter usernames (Twitter source only)"),
13
+ sources: z
14
+ .string()
15
+ .optional()
16
+ .describe("Comma-separated: Twitter, News (default: Twitter,News)"),
17
+ min_created_at: z
18
+ .string()
19
+ .optional()
20
+ .describe("Min creation date ISO 8601 (default: 90 days ago)"),
21
+ max_created_at: z
22
+ .string()
23
+ .optional()
24
+ .describe("Max creation date ISO 8601"),
25
+ from: z
26
+ .number()
27
+ .optional()
28
+ .describe("Pagination offset 0-500 (default: 0)"),
29
+ size: z
30
+ .number()
31
+ .optional()
32
+ .describe("Results per page 1-20 (default: 20)"),
33
+ languages: z
34
+ .string()
35
+ .optional()
36
+ .describe("Comma-separated: en, zh, ko, others (default: en)"),
37
+ sort_by: z
38
+ .enum(["relevance", "created_at", "engagement", "smart_engagement", "author", "length", "bookmark", "sentiment", "views"])
39
+ .optional()
40
+ .describe("Sort field (default: relevance)"),
41
+ sort_order: z
42
+ .enum(["asc", "desc"])
43
+ .optional()
44
+ .describe("Sort order (default: desc). asc only works with created_at and sentiment"),
45
+ tweet_length_type: z
46
+ .enum(["short", "long", "thread", "article"])
47
+ .optional()
48
+ .describe("Twitter only: tweet length type"),
49
+ tweet_type: z
50
+ .enum(["tweet", "quote", "reply"])
51
+ .optional()
52
+ .describe("Twitter only: tweet type"),
53
+ sentiment_type: z
54
+ .enum(["bullish", "bearish", "neutral"])
55
+ .optional()
56
+ .describe("Twitter only: sentiment filter"),
57
+ author_type: z
58
+ .enum(["Organization", "Individual"])
59
+ .optional()
60
+ .describe("Twitter only: author type"),
61
+ min_bookmark_count: z
62
+ .number()
63
+ .optional()
64
+ .describe("Twitter only: min bookmarks"),
65
+ max_bookmark_count: z
66
+ .number()
67
+ .optional()
68
+ .describe("Twitter only: max bookmarks"),
69
+ min_view_count: z
70
+ .number()
71
+ .optional()
72
+ .describe("Twitter only: min views"),
73
+ max_view_count: z
74
+ .number()
75
+ .optional()
76
+ .describe("Twitter only: max views"),
77
+ min_smart_engagement_count: z
78
+ .number()
79
+ .optional()
80
+ .describe("Twitter only: min smart engagements"),
81
+ max_smart_engagement_count: z
82
+ .number()
83
+ .optional()
84
+ .describe("Twitter only: max smart engagements"),
85
+ min_like_count: z
86
+ .number()
87
+ .optional()
88
+ .describe("Twitter only: min likes"),
89
+ max_like_count: z
90
+ .number()
91
+ .optional()
92
+ .describe("Twitter only: max likes"),
93
+ min_reply_count: z
94
+ .number()
95
+ .optional()
96
+ .describe("Twitter only: min replies"),
97
+ max_reply_count: z
98
+ .number()
99
+ .optional()
100
+ .describe("Twitter only: max replies"),
101
+ min_retweet_count: z
102
+ .number()
103
+ .optional()
104
+ .describe("Twitter only: min retweets"),
105
+ max_retweet_count: z
106
+ .number()
107
+ .optional()
108
+ .describe("Twitter only: max retweets"),
109
+ min_quote_count: z
110
+ .number()
111
+ .optional()
112
+ .describe("Twitter only: min quotes"),
113
+ max_quote_count: z
114
+ .number()
115
+ .optional()
116
+ .describe("Twitter only: max quotes"),
117
+ }, {
118
+ readOnlyHint: true,
119
+ openWorldHint: true,
120
+ }, async (params) => {
121
+ const queryParams = {};
122
+ for (const [key, value] of Object.entries(params)) {
123
+ if (value !== undefined) {
124
+ queryParams[key] = value.toString();
125
+ }
126
+ }
127
+ const data = await client.request("advanced_search", queryParams);
128
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
129
+ });
130
+ }
131
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { KaitoClient } from "../client.js";
3
+ export declare function registerSocialTools(server: McpServer, client: KaitoClient): void;
4
+ //# sourceMappingURL=social.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/tools/social.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAO3C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,QAoFzE"}
@@ -0,0 +1,71 @@
1
+ import { z } from "zod";
2
+ const TOOL_ANNOTATIONS = {
3
+ readOnlyHint: true,
4
+ openWorldHint: true,
5
+ };
6
+ export function registerSocialTools(server, client) {
7
+ server.tool("kaito_smart_followers", "Get smart follower data for a Twitter user. 'count' mode returns cumulative smart follower count; 'users' mode returns the list of smart followers gained on a specific date.", {
8
+ user_id: z
9
+ .string()
10
+ .optional()
11
+ .describe("Twitter user ID. One of user_id or username is required."),
12
+ username: z
13
+ .string()
14
+ .optional()
15
+ .describe("Twitter username. One of user_id or username is required."),
16
+ date: z
17
+ .string()
18
+ .optional()
19
+ .describe("Date YYYY-MM-DD (default: yesterday, must be >= 2024-01-01)"),
20
+ mode: z
21
+ .enum(["count", "users"])
22
+ .optional()
23
+ .describe("'count' for cumulative count, 'users' for follower list (default: count)"),
24
+ }, TOOL_ANNOTATIONS, async ({ user_id, username, date, mode }) => {
25
+ const data = await client.request("smart_followers", {
26
+ user_id,
27
+ username,
28
+ date,
29
+ mode,
30
+ });
31
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
32
+ });
33
+ server.tool("kaito_smart_following", "Get the latest 100 smart accounts followed by a Twitter user, in reverse chronological order.", {
34
+ user_id: z
35
+ .string()
36
+ .optional()
37
+ .describe("Twitter user ID. One of user_id or username is required."),
38
+ username: z
39
+ .string()
40
+ .optional()
41
+ .describe("Twitter username. One of user_id or username is required."),
42
+ category: z
43
+ .enum(["ALL", "Organization", "Individual"])
44
+ .optional()
45
+ .describe("Filter by account type"),
46
+ }, TOOL_ANNOTATIONS, async ({ user_id, username, category }) => {
47
+ const data = await client.request("smart_following", {
48
+ user_id,
49
+ username,
50
+ category,
51
+ });
52
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
53
+ });
54
+ server.tool("kaito_reciprocal_followers", "Get reciprocal (mutual) followers for a Twitter user, sorted by smart follower count descending.", {
55
+ user_id: z
56
+ .string()
57
+ .optional()
58
+ .describe("Twitter user ID. One of user_id or username is required."),
59
+ username: z
60
+ .string()
61
+ .optional()
62
+ .describe("Twitter username. One of user_id or username is required."),
63
+ }, TOOL_ANNOTATIONS, async ({ user_id, username }) => {
64
+ const data = await client.request("reciprocal_followers", {
65
+ user_id,
66
+ username,
67
+ });
68
+ return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
69
+ });
70
+ }
71
+ //# sourceMappingURL=social.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/tools/social.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "kaito-mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Kaito AI crypto market intelligence API",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "bin": {
8
+ "kaito-mcp-server": "./build/index.js"
9
+ },
10
+ "files": [
11
+ "build"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "start": "node build/index.js"
17
+ },
18
+ "dependencies": {
19
+ "@modelcontextprotocol/sdk": "^1.27.0",
20
+ "zod": "^3.23.0"
21
+ },
22
+ "devDependencies": {
23
+ "@types/node": "^22",
24
+ "typescript": "^5.7.0"
25
+ }
26
+ }