@suigar/mcp 0.1.1 → 0.2.0-beta.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.
- package/CHANGELOG.md +18 -0
- package/LICENSE +201 -0
- package/README.md +79 -110
- package/dist/app/index.html +181 -0
- package/dist/bin.mjs +4 -8
- package/dist/bin.mjs.map +1 -0
- package/dist/client.d.mts +47 -0
- package/dist/client.d.mts.map +1 -0
- package/dist/client.mjs +116 -0
- package/dist/client.mjs.map +1 -0
- package/dist/dry-run.mjs +163 -0
- package/dist/dry-run.mjs.map +1 -0
- package/dist/format.mjs +24 -0
- package/dist/format.mjs.map +1 -0
- package/dist/index.d.mts +6 -820
- package/dist/index.mjs +5 -2
- package/dist/schemas.d.mts +642 -0
- package/dist/schemas.d.mts.map +1 -0
- package/dist/schemas.mjs +113 -0
- package/dist/schemas.mjs.map +1 -0
- package/dist/server.d.mts +21 -69
- package/dist/server.d.mts.map +1 -0
- package/dist/server.mjs +192 -2
- package/dist/server.mjs.map +1 -0
- package/dist/tools.d.mts +17 -0
- package/dist/tools.d.mts.map +1 -0
- package/dist/tools.mjs +352 -0
- package/dist/tools.mjs.map +1 -0
- package/dist/types.d.mts +137 -0
- package/dist/types.d.mts.map +1 -0
- package/package.json +33 -25
- package/dist/bin.cjs +0 -11
- package/dist/bin.d.cts +0 -1
- package/dist/index.cjs +0 -46
- package/dist/index.d.cts +0 -820
- package/dist/server-BD-123-u.mjs +0 -47003
- package/dist/server-Cmo8UaHE.cjs +0 -47266
- package/dist/server.cjs +0 -4
- package/dist/server.d.cts +0 -73
package/dist/schemas.mjs
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { SUPPORTED_SUI_NETWORKS } from "@suigar/sdk";
|
|
3
|
+
import { GAMES } from "@suigar/sdk/games";
|
|
4
|
+
//#region src/schemas.ts
|
|
5
|
+
const builderModes = [
|
|
6
|
+
"build",
|
|
7
|
+
"dry-run",
|
|
8
|
+
"read-only"
|
|
9
|
+
];
|
|
10
|
+
const addressDescription = "Sui address or SuiNS name such as 0xabc..., name.sui, or sub.name.sui; required for build and dry-run modes.";
|
|
11
|
+
const coinTypeDescription = "Move coin type such as 0x2::sui::SUI. Defaults to the SDK-configured SUI coin type.";
|
|
12
|
+
const currencyAmountDescription = "Currency amount in the chosen coin, converted to base units using the configured coin decimals.";
|
|
13
|
+
const currencyAmountSchema = z.union([z.number().nonnegative(), z.string().regex(/^(?:\d+|\d+\.\d+|\.\d+)$/u)]);
|
|
14
|
+
const coinMetadataSchema = z.object({
|
|
15
|
+
coinType: z.string().min(1).optional(),
|
|
16
|
+
decimals: z.number().int().nonnegative().optional()
|
|
17
|
+
}).strict();
|
|
18
|
+
const configOverridesSchema = z.object({
|
|
19
|
+
packageIds: z.object({
|
|
20
|
+
sweetHouse: z.string().min(1).optional(),
|
|
21
|
+
core: z.string().min(1).optional(),
|
|
22
|
+
coinflip: z.string().min(1).optional(),
|
|
23
|
+
limbo: z.string().min(1).optional(),
|
|
24
|
+
plinko: z.string().min(1).optional(),
|
|
25
|
+
pvpCoinflip: z.string().min(1).optional(),
|
|
26
|
+
range: z.string().min(1).optional(),
|
|
27
|
+
wheel: z.string().min(1).optional()
|
|
28
|
+
}).strict().optional(),
|
|
29
|
+
registryIds: z.object({ pvpCoinflip: z.string().min(1).optional() }).strict().optional(),
|
|
30
|
+
coins: z.object({
|
|
31
|
+
sui: coinMetadataSchema.optional(),
|
|
32
|
+
usdc: coinMetadataSchema.optional()
|
|
33
|
+
}).strict().optional(),
|
|
34
|
+
priceInfoObjectIds: z.object({
|
|
35
|
+
sui: z.string().min(1).optional(),
|
|
36
|
+
usdc: z.string().min(1).optional()
|
|
37
|
+
}).strict().optional()
|
|
38
|
+
}).strict();
|
|
39
|
+
const configInputSchema = z.object({
|
|
40
|
+
network: z.enum(SUPPORTED_SUI_NETWORKS).default("testnet").describe("Sui network. Only mainnet and testnet are supported."),
|
|
41
|
+
providerUrl: z.string().url().optional().describe("Optional Sui gRPC endpoint URL."),
|
|
42
|
+
config: configOverridesSchema.optional().describe("SDK-style SuigarConfigOverrides."),
|
|
43
|
+
partner: z.string().min(1).optional().describe("Partner wallet address injected through the SDK extension.")
|
|
44
|
+
}).strict();
|
|
45
|
+
const readConfigInputSchema = configInputSchema;
|
|
46
|
+
const readGameMetadataInputSchema = configInputSchema.extend({
|
|
47
|
+
game: z.enum(GAMES).optional().describe("Optional Suigar game id to inspect."),
|
|
48
|
+
coinType: z.string().min(1).optional().describe(coinTypeDescription)
|
|
49
|
+
}).strict();
|
|
50
|
+
const metadataSchema = z.record(z.string(), z.union([
|
|
51
|
+
z.string(),
|
|
52
|
+
z.number(),
|
|
53
|
+
z.boolean()
|
|
54
|
+
]));
|
|
55
|
+
const commonBuildInputSchema = configInputSchema.extend({
|
|
56
|
+
mode: z.enum(builderModes).default("build").describe("Build, dry-run, or return a read-only plan."),
|
|
57
|
+
owner: z.string().min(1).optional().describe(addressDescription),
|
|
58
|
+
coinType: z.string().min(1).optional().describe(coinTypeDescription),
|
|
59
|
+
metadata: metadataSchema.optional().describe("Metadata values encoded by @suigar/sdk."),
|
|
60
|
+
gasBudget: z.number().int().positive().optional().describe("Optional gas budget in MIST."),
|
|
61
|
+
useGasCoin: z.boolean().optional().describe("Allow the SUI gas coin to be used for native SUI bet coins.")
|
|
62
|
+
}).strict();
|
|
63
|
+
const stakeBuildInputSchema = commonBuildInputSchema.extend({
|
|
64
|
+
stake: currencyAmountSchema.optional().describe(`Logical wager. ${currencyAmountDescription}`),
|
|
65
|
+
cashStake: currencyAmountSchema.optional().describe(`Optional withdrawn amount. ${currencyAmountDescription}`),
|
|
66
|
+
betCount: z.union([z.number().int().positive(), z.string().regex(/^[1-9]\d*$/u)]).optional().describe("Optional bet count.")
|
|
67
|
+
}).strict();
|
|
68
|
+
const coinflipInputSchema = stakeBuildInputSchema.extend({ side: z.enum(["heads", "tails"]).optional().describe("Selected coinflip side.") }).strict();
|
|
69
|
+
const limboInputSchema = stakeBuildInputSchema.extend({ targetMultiplier: z.number().positive().optional().describe("Target multiplier.") }).strict();
|
|
70
|
+
const configIdInputSchema = stakeBuildInputSchema.extend({ configId: z.number().int().min(0).max(255).optional().describe("On-chain game config id.") }).strict();
|
|
71
|
+
const rangeInputSchema = stakeBuildInputSchema.extend({
|
|
72
|
+
leftPoint: z.number().optional().describe("Left range point."),
|
|
73
|
+
rightPoint: z.number().optional().describe("Right range point."),
|
|
74
|
+
outOfRange: z.boolean().optional().describe("Whether the bet targets outside the selected range.")
|
|
75
|
+
}).strict();
|
|
76
|
+
const pvpCoinflipCreateInputSchema = commonBuildInputSchema.extend({
|
|
77
|
+
stake: currencyAmountSchema.optional().describe(`Stake per player. ${currencyAmountDescription}`),
|
|
78
|
+
creatorSide: z.enum(["heads", "tails"]).optional().describe("Creator side."),
|
|
79
|
+
isPrivate: z.boolean().optional().describe("Whether the PvP lobby is private.")
|
|
80
|
+
}).strict();
|
|
81
|
+
const pvpCoinflipJoinInputSchema = commonBuildInputSchema.extend({
|
|
82
|
+
gameId: z.string().min(1).optional().describe("PvP coinflip game object id."),
|
|
83
|
+
coinType: z.string().min(1).optional().describe(coinTypeDescription)
|
|
84
|
+
}).strict();
|
|
85
|
+
const pvpCoinflipCancelInputSchema = commonBuildInputSchema.extend({
|
|
86
|
+
gameId: z.string().min(1).optional().describe("PvP coinflip game object id."),
|
|
87
|
+
coinType: z.string().min(1).optional().describe(coinTypeDescription)
|
|
88
|
+
}).strict();
|
|
89
|
+
const unknownJsonSchema = z.lazy(() => z.union([
|
|
90
|
+
z.string(),
|
|
91
|
+
z.number(),
|
|
92
|
+
z.boolean(),
|
|
93
|
+
z.null(),
|
|
94
|
+
z.array(unknownJsonSchema),
|
|
95
|
+
z.record(z.string(), unknownJsonSchema)
|
|
96
|
+
]));
|
|
97
|
+
const toolOutputSchema = z.object({
|
|
98
|
+
mode: z.enum(builderModes).optional(),
|
|
99
|
+
network: z.enum(SUPPORTED_SUI_NETWORKS).optional(),
|
|
100
|
+
config: unknownJsonSchema.optional(),
|
|
101
|
+
game: unknownJsonSchema.optional(),
|
|
102
|
+
action: z.string().optional(),
|
|
103
|
+
plan: unknownJsonSchema.optional(),
|
|
104
|
+
summary: unknownJsonSchema.optional(),
|
|
105
|
+
transactionBytesBase64: z.string().optional(),
|
|
106
|
+
dryRun: unknownJsonSchema.optional(),
|
|
107
|
+
dryRunSummary: unknownJsonSchema.optional(),
|
|
108
|
+
errors: z.array(z.string()).optional()
|
|
109
|
+
}).loose();
|
|
110
|
+
//#endregion
|
|
111
|
+
export { builderModes, coinflipInputSchema, commonBuildInputSchema, configIdInputSchema, configInputSchema, configOverridesSchema, limboInputSchema, metadataSchema, pvpCoinflipCancelInputSchema, pvpCoinflipCreateInputSchema, pvpCoinflipJoinInputSchema, rangeInputSchema, readConfigInputSchema, readGameMetadataInputSchema, stakeBuildInputSchema, toolOutputSchema };
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=schemas.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.mjs","names":[],"sources":["../src/schemas.ts"],"sourcesContent":["// Copyright (c) Suigar\n// SPDX-License-Identifier: Apache-2.0\n\nimport { z } from 'zod/v4';\nimport { SUPPORTED_SUI_NETWORKS } from '@suigar/sdk';\nimport { GAMES } from '@suigar/sdk/games';\n\nexport const builderModes = ['build', 'dry-run', 'read-only'] as const;\n\nconst addressDescription =\n\t'Sui address or SuiNS name such as 0xabc..., name.sui, or sub.name.sui; required for build and dry-run modes.';\nconst coinTypeDescription =\n\t'Move coin type such as 0x2::sui::SUI. Defaults to the SDK-configured SUI coin type.';\nconst currencyAmountDescription =\n\t'Currency amount in the chosen coin, converted to base units using the configured coin decimals.';\nconst currencyAmountSchema = z.union([\n\tz.number().nonnegative(),\n\tz.string().regex(/^(?:\\d+|\\d+\\.\\d+|\\.\\d+)$/u),\n]);\n\nconst coinMetadataSchema = z\n\t.object({\n\t\tcoinType: z.string().min(1).optional(),\n\t\tdecimals: z.number().int().nonnegative().optional(),\n\t})\n\t.strict();\n\nexport const configOverridesSchema = z\n\t.object({\n\t\tpackageIds: z\n\t\t\t.object({\n\t\t\t\tsweetHouse: z.string().min(1).optional(),\n\t\t\t\tcore: z.string().min(1).optional(),\n\t\t\t\tcoinflip: z.string().min(1).optional(),\n\t\t\t\tlimbo: z.string().min(1).optional(),\n\t\t\t\tplinko: z.string().min(1).optional(),\n\t\t\t\tpvpCoinflip: z.string().min(1).optional(),\n\t\t\t\trange: z.string().min(1).optional(),\n\t\t\t\twheel: z.string().min(1).optional(),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tregistryIds: z\n\t\t\t.object({\n\t\t\t\tpvpCoinflip: z.string().min(1).optional(),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tcoins: z\n\t\t\t.object({\n\t\t\t\tsui: coinMetadataSchema.optional(),\n\t\t\t\tusdc: coinMetadataSchema.optional(),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t\tpriceInfoObjectIds: z\n\t\t\t.object({\n\t\t\t\tsui: z.string().min(1).optional(),\n\t\t\t\tusdc: z.string().min(1).optional(),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.optional(),\n\t})\n\t.strict();\n\nexport const configInputSchema = z\n\t.object({\n\t\tnetwork: z\n\t\t\t.enum(SUPPORTED_SUI_NETWORKS)\n\t\t\t.default('testnet')\n\t\t\t.describe('Sui network. Only mainnet and testnet are supported.'),\n\t\tproviderUrl: z\n\t\t\t.string()\n\t\t\t.url()\n\t\t\t.optional()\n\t\t\t.describe('Optional Sui gRPC endpoint URL.'),\n\t\tconfig: configOverridesSchema\n\t\t\t.optional()\n\t\t\t.describe('SDK-style SuigarConfigOverrides.'),\n\t\tpartner: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.optional()\n\t\t\t.describe('Partner wallet address injected through the SDK extension.'),\n\t})\n\t.strict();\n\nexport const readConfigInputSchema = configInputSchema;\n\nexport const readGameMetadataInputSchema = configInputSchema\n\t.extend({\n\t\tgame: z\n\t\t\t.enum(GAMES)\n\t\t\t.optional()\n\t\t\t.describe('Optional Suigar game id to inspect.'),\n\t\tcoinType: z.string().min(1).optional().describe(coinTypeDescription),\n\t})\n\t.strict();\n\nexport const metadataSchema = z.record(\n\tz.string(),\n\tz.union([z.string(), z.number(), z.boolean()]),\n);\n\nexport const commonBuildInputSchema = configInputSchema\n\t.extend({\n\t\tmode: z\n\t\t\t.enum(builderModes)\n\t\t\t.default('build')\n\t\t\t.describe('Build, dry-run, or return a read-only plan.'),\n\t\towner: z.string().min(1).optional().describe(addressDescription),\n\t\tcoinType: z.string().min(1).optional().describe(coinTypeDescription),\n\t\tmetadata: metadataSchema\n\t\t\t.optional()\n\t\t\t.describe('Metadata values encoded by @suigar/sdk.'),\n\t\tgasBudget: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.positive()\n\t\t\t.optional()\n\t\t\t.describe('Optional gas budget in MIST.'),\n\t\tuseGasCoin: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe('Allow the SUI gas coin to be used for native SUI bet coins.'),\n\t})\n\t.strict();\n\nexport const stakeBuildInputSchema = commonBuildInputSchema\n\t.extend({\n\t\tstake: currencyAmountSchema\n\t\t\t.optional()\n\t\t\t.describe(`Logical wager. ${currencyAmountDescription}`),\n\t\tcashStake: currencyAmountSchema\n\t\t\t.optional()\n\t\t\t.describe(`Optional withdrawn amount. ${currencyAmountDescription}`),\n\t\tbetCount: z\n\t\t\t.union([z.number().int().positive(), z.string().regex(/^[1-9]\\d*$/u)])\n\t\t\t.optional()\n\t\t\t.describe('Optional bet count.'),\n\t})\n\t.strict();\n\nexport const coinflipInputSchema = stakeBuildInputSchema\n\t.extend({\n\t\tside: z\n\t\t\t.enum(['heads', 'tails'])\n\t\t\t.optional()\n\t\t\t.describe('Selected coinflip side.'),\n\t})\n\t.strict();\n\nexport const limboInputSchema = stakeBuildInputSchema\n\t.extend({\n\t\ttargetMultiplier: z\n\t\t\t.number()\n\t\t\t.positive()\n\t\t\t.optional()\n\t\t\t.describe('Target multiplier.'),\n\t})\n\t.strict();\n\nexport const configIdInputSchema = stakeBuildInputSchema\n\t.extend({\n\t\tconfigId: z\n\t\t\t.number()\n\t\t\t.int()\n\t\t\t.min(0)\n\t\t\t.max(255)\n\t\t\t.optional()\n\t\t\t.describe('On-chain game config id.'),\n\t})\n\t.strict();\n\nexport const rangeInputSchema = stakeBuildInputSchema\n\t.extend({\n\t\tleftPoint: z.number().optional().describe('Left range point.'),\n\t\trightPoint: z.number().optional().describe('Right range point.'),\n\t\toutOfRange: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe('Whether the bet targets outside the selected range.'),\n\t})\n\t.strict();\n\nexport const pvpCoinflipCreateInputSchema = commonBuildInputSchema\n\t.extend({\n\t\tstake: currencyAmountSchema\n\t\t\t.optional()\n\t\t\t.describe(`Stake per player. ${currencyAmountDescription}`),\n\t\tcreatorSide: z\n\t\t\t.enum(['heads', 'tails'])\n\t\t\t.optional()\n\t\t\t.describe('Creator side.'),\n\t\tisPrivate: z\n\t\t\t.boolean()\n\t\t\t.optional()\n\t\t\t.describe('Whether the PvP lobby is private.'),\n\t})\n\t.strict();\n\nexport const pvpCoinflipJoinInputSchema = commonBuildInputSchema\n\t.extend({\n\t\tgameId: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.optional()\n\t\t\t.describe('PvP coinflip game object id.'),\n\t\tcoinType: z.string().min(1).optional().describe(coinTypeDescription),\n\t})\n\t.strict();\n\nexport const pvpCoinflipCancelInputSchema = commonBuildInputSchema\n\t.extend({\n\t\tgameId: z\n\t\t\t.string()\n\t\t\t.min(1)\n\t\t\t.optional()\n\t\t\t.describe('PvP coinflip game object id.'),\n\t\tcoinType: z.string().min(1).optional().describe(coinTypeDescription),\n\t})\n\t.strict();\n\nconst unknownJsonSchema: z.ZodType<unknown> = z.lazy(() =>\n\tz.union([\n\t\tz.string(),\n\t\tz.number(),\n\t\tz.boolean(),\n\t\tz.null(),\n\t\tz.array(unknownJsonSchema),\n\t\tz.record(z.string(), unknownJsonSchema),\n\t]),\n);\n\nexport const toolOutputSchema = z\n\t.object({\n\t\tmode: z.enum(builderModes).optional(),\n\t\tnetwork: z.enum(SUPPORTED_SUI_NETWORKS).optional(),\n\t\tconfig: unknownJsonSchema.optional(),\n\t\tgame: unknownJsonSchema.optional(),\n\t\taction: z.string().optional(),\n\t\tplan: unknownJsonSchema.optional(),\n\t\tsummary: unknownJsonSchema.optional(),\n\t\ttransactionBytesBase64: z.string().optional(),\n\t\tdryRun: unknownJsonSchema.optional(),\n\t\tdryRunSummary: unknownJsonSchema.optional(),\n\t\terrors: z.array(z.string()).optional(),\n\t})\n\t.loose();\n\nexport type ReadConfigInput = z.input<typeof readConfigInputSchema>;\nexport type ReadGameMetadataInput = z.input<typeof readGameMetadataInputSchema>;\nexport type CommonBuildInput = z.input<typeof commonBuildInputSchema>;\nexport type CoinflipInput = z.input<typeof coinflipInputSchema>;\nexport type LimboInput = z.input<typeof limboInputSchema>;\nexport type ConfigIdInput = z.input<typeof configIdInputSchema>;\nexport type RangeInput = z.input<typeof rangeInputSchema>;\nexport type PvpCoinflipCreateInput = z.input<\n\ttypeof pvpCoinflipCreateInputSchema\n>;\nexport type PvpCoinflipJoinInput = z.input<typeof pvpCoinflipJoinInputSchema>;\nexport type PvpCoinflipCancelInput = z.input<\n\ttypeof pvpCoinflipCancelInputSchema\n>;\n"],"mappings":"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"}
|
package/dist/server.d.mts
CHANGED
|
@@ -1,73 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
2
|
|
|
3
3
|
//#region src/server.d.ts
|
|
4
|
-
declare const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
_meta?: {
|
|
21
|
-
[x: string]: unknown;
|
|
22
|
-
progressToken?: string | number | undefined;
|
|
23
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
24
|
-
taskId: string;
|
|
25
|
-
} | undefined;
|
|
26
|
-
} | undefined;
|
|
27
|
-
} | undefined;
|
|
28
|
-
}, {
|
|
29
|
-
[x: string]: unknown;
|
|
30
|
-
_meta?: {
|
|
31
|
-
[x: string]: unknown;
|
|
32
|
-
progressToken?: string | number | undefined;
|
|
33
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
34
|
-
taskId: string;
|
|
35
|
-
} | undefined;
|
|
36
|
-
} | undefined;
|
|
4
|
+
declare const SUIGAR_MCP_APP_RESOURCE_URI = "ui://suigar/transaction-inspector.html";
|
|
5
|
+
declare const readSuigarMcpAppHtml: () => Promise<any>;
|
|
6
|
+
declare const createSuigarMcpAppResourceResult: () => Promise<{
|
|
7
|
+
contents: {
|
|
8
|
+
uri: string;
|
|
9
|
+
mimeType: string;
|
|
10
|
+
text: any;
|
|
11
|
+
_meta: {
|
|
12
|
+
ui: {
|
|
13
|
+
csp: {
|
|
14
|
+
connectDomains: never[];
|
|
15
|
+
resourceDomains: never[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
}[];
|
|
37
20
|
}>;
|
|
38
|
-
declare const
|
|
39
|
-
|
|
40
|
-
params?: {
|
|
41
|
-
[x: string]: unknown;
|
|
42
|
-
_meta?: {
|
|
43
|
-
[x: string]: unknown;
|
|
44
|
-
progressToken?: string | number | undefined;
|
|
45
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
46
|
-
taskId: string;
|
|
47
|
-
} | undefined;
|
|
48
|
-
} | undefined;
|
|
49
|
-
} | undefined;
|
|
50
|
-
}, {
|
|
51
|
-
method: string;
|
|
52
|
-
params?: {
|
|
53
|
-
[x: string]: unknown;
|
|
54
|
-
_meta?: {
|
|
55
|
-
[x: string]: unknown;
|
|
56
|
-
progressToken?: string | number | undefined;
|
|
57
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
58
|
-
taskId: string;
|
|
59
|
-
} | undefined;
|
|
60
|
-
} | undefined;
|
|
61
|
-
} | undefined;
|
|
62
|
-
}, {
|
|
63
|
-
[x: string]: unknown;
|
|
64
|
-
_meta?: {
|
|
65
|
-
[x: string]: unknown;
|
|
66
|
-
progressToken?: string | number | undefined;
|
|
67
|
-
"io.modelcontextprotocol/related-task"?: {
|
|
68
|
-
taskId: string;
|
|
69
|
-
} | undefined;
|
|
70
|
-
} | undefined;
|
|
71
|
-
}>>;
|
|
21
|
+
declare const createSuigarMcpServer: () => McpServer;
|
|
22
|
+
declare const startSuigarMcpServer: () => Promise<void>;
|
|
72
23
|
//#endregion
|
|
73
|
-
export { createSuigarMcpServer, startSuigarMcpServer };
|
|
24
|
+
export { SUIGAR_MCP_APP_RESOURCE_URI, createSuigarMcpAppResourceResult, createSuigarMcpServer, readSuigarMcpAppHtml, startSuigarMcpServer };
|
|
25
|
+
//# sourceMappingURL=server.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.mts","names":[],"sources":["../src/server.ts"],"mappings":";;;cAsCa,2BAAA;AAAA,cA6CA,oBAAA,QAAoB,OAAA;AAAA,cAapB,gCAAA,QAAgC,OAAA;;;;;;;;;;;;;;;cAkBhC,qBAAA,QAAqB,SA8NjC;AAAA,cAEY,oBAAA,QAAoB,OAAA"}
|
package/dist/server.mjs
CHANGED
|
@@ -1,2 +1,192 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { coinflipInputSchema, configIdInputSchema, limboInputSchema, pvpCoinflipCancelInputSchema, pvpCoinflipCreateInputSchema, pvpCoinflipJoinInputSchema, rangeInputSchema, readConfigInputSchema, readGameMetadataInputSchema, toolOutputSchema } from "./schemas.mjs";
|
|
2
|
+
import { buildCoinflipTransactionTool, buildLimboTransactionTool, buildPlinkoTransactionTool, buildPvpCoinflipCancelTransactionTool, buildPvpCoinflipCreateTransactionTool, buildPvpCoinflipJoinTransactionTool, buildRangeTransactionTool, buildWheelTransactionTool, readConfigTool, readGameMetadataTool } from "./tools.mjs";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import { readFile } from "node:fs/promises";
|
|
5
|
+
import { RESOURCE_MIME_TYPE, registerAppResource, registerAppTool } from "@modelcontextprotocol/ext-apps/server";
|
|
6
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
//#region src/server.ts
|
|
9
|
+
const SUIGAR_MCP_APP_RESOURCE_URI = "ui://suigar/transaction-inspector.html";
|
|
10
|
+
const packageJson = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
11
|
+
const errorText = (error) => {
|
|
12
|
+
if (error instanceof Error) return `${error.name}: ${error.message}`;
|
|
13
|
+
return String(error);
|
|
14
|
+
};
|
|
15
|
+
const hasErrorCode = (error, code) => error instanceof Error && "code" in error && error.code === code;
|
|
16
|
+
const withToolErrors = (handler) => async (input) => {
|
|
17
|
+
try {
|
|
18
|
+
return await handler(input);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
return {
|
|
21
|
+
isError: true,
|
|
22
|
+
content: [{
|
|
23
|
+
type: "text",
|
|
24
|
+
text: `${errorText(error)}\n\nCheck required fields, network, coin type, and SDK config overrides. The MCP server only builds unsigned transactions and never signs or executes them.`
|
|
25
|
+
}]
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const readSuigarMcpAppHtml = async () => {
|
|
30
|
+
try {
|
|
31
|
+
return await readFile(new URL("./app/index.html", import.meta.url), "utf8");
|
|
32
|
+
} catch (error) {
|
|
33
|
+
if (!hasErrorCode(error, "ENOENT")) throw error;
|
|
34
|
+
throw new Error("Unable to find bundled Suigar MCP App HTML.", { cause: error });
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const createSuigarMcpAppResourceResult = async () => ({ contents: [{
|
|
38
|
+
uri: SUIGAR_MCP_APP_RESOURCE_URI,
|
|
39
|
+
mimeType: RESOURCE_MIME_TYPE,
|
|
40
|
+
text: await readSuigarMcpAppHtml(),
|
|
41
|
+
_meta: { ui: { csp: {
|
|
42
|
+
connectDomains: [],
|
|
43
|
+
resourceDomains: []
|
|
44
|
+
} } }
|
|
45
|
+
}] });
|
|
46
|
+
const createSuigarMcpServer = () => {
|
|
47
|
+
const server = new McpServer({
|
|
48
|
+
name: "suigar",
|
|
49
|
+
version: packageJson.version
|
|
50
|
+
});
|
|
51
|
+
server.registerTool("read_config", {
|
|
52
|
+
title: "Read Suigar Config",
|
|
53
|
+
description: "Resolve Suigar SDK config for mainnet or testnet. Defaults to testnet.",
|
|
54
|
+
inputSchema: readConfigInputSchema,
|
|
55
|
+
outputSchema: toolOutputSchema,
|
|
56
|
+
annotations: {
|
|
57
|
+
readOnlyHint: true,
|
|
58
|
+
destructiveHint: false,
|
|
59
|
+
idempotentHint: true,
|
|
60
|
+
openWorldHint: false
|
|
61
|
+
}
|
|
62
|
+
}, withToolErrors(readConfigTool));
|
|
63
|
+
registerAppResource(server, "Suigar Transaction Inspector", SUIGAR_MCP_APP_RESOURCE_URI, { description: "Compact MCP App UI for inspecting Suigar config, transaction plans, summaries, dry-runs, and serialized bytes." }, createSuigarMcpAppResourceResult);
|
|
64
|
+
const appToolMeta = { ui: { resourceUri: SUIGAR_MCP_APP_RESOURCE_URI } };
|
|
65
|
+
registerAppTool(server, "read_game_metadata", {
|
|
66
|
+
title: "Read Suigar Game Metadata",
|
|
67
|
+
description: "Read SDK-backed metadata for a supported Suigar game and coin type.",
|
|
68
|
+
inputSchema: readGameMetadataInputSchema,
|
|
69
|
+
outputSchema: toolOutputSchema,
|
|
70
|
+
annotations: {
|
|
71
|
+
readOnlyHint: true,
|
|
72
|
+
destructiveHint: false,
|
|
73
|
+
idempotentHint: true,
|
|
74
|
+
openWorldHint: false
|
|
75
|
+
},
|
|
76
|
+
_meta: appToolMeta
|
|
77
|
+
}, withToolErrors(readGameMetadataTool));
|
|
78
|
+
registerAppTool(server, "build_coinflip_transaction", {
|
|
79
|
+
title: "Build Coinflip Transaction",
|
|
80
|
+
description: "Build, dry-run, or inspect an unsigned Suigar coinflip transaction.",
|
|
81
|
+
inputSchema: coinflipInputSchema,
|
|
82
|
+
outputSchema: toolOutputSchema,
|
|
83
|
+
annotations: {
|
|
84
|
+
readOnlyHint: false,
|
|
85
|
+
destructiveHint: false,
|
|
86
|
+
idempotentHint: false,
|
|
87
|
+
openWorldHint: true
|
|
88
|
+
},
|
|
89
|
+
_meta: appToolMeta
|
|
90
|
+
}, withToolErrors(buildCoinflipTransactionTool));
|
|
91
|
+
registerAppTool(server, "build_limbo_transaction", {
|
|
92
|
+
title: "Build Limbo Transaction",
|
|
93
|
+
description: "Build, dry-run, or inspect an unsigned Suigar limbo transaction.",
|
|
94
|
+
inputSchema: limboInputSchema,
|
|
95
|
+
outputSchema: toolOutputSchema,
|
|
96
|
+
annotations: {
|
|
97
|
+
readOnlyHint: false,
|
|
98
|
+
destructiveHint: false,
|
|
99
|
+
idempotentHint: false,
|
|
100
|
+
openWorldHint: true
|
|
101
|
+
},
|
|
102
|
+
_meta: appToolMeta
|
|
103
|
+
}, withToolErrors(buildLimboTransactionTool));
|
|
104
|
+
registerAppTool(server, "build_plinko_transaction", {
|
|
105
|
+
title: "Build Plinko Transaction",
|
|
106
|
+
description: "Build, dry-run, or inspect an unsigned Suigar plinko transaction.",
|
|
107
|
+
inputSchema: configIdInputSchema,
|
|
108
|
+
outputSchema: toolOutputSchema,
|
|
109
|
+
annotations: {
|
|
110
|
+
readOnlyHint: false,
|
|
111
|
+
destructiveHint: false,
|
|
112
|
+
idempotentHint: false,
|
|
113
|
+
openWorldHint: true
|
|
114
|
+
},
|
|
115
|
+
_meta: appToolMeta
|
|
116
|
+
}, withToolErrors(buildPlinkoTransactionTool));
|
|
117
|
+
registerAppTool(server, "build_wheel_transaction", {
|
|
118
|
+
title: "Build Wheel Transaction",
|
|
119
|
+
description: "Build, dry-run, or inspect an unsigned Suigar wheel transaction.",
|
|
120
|
+
inputSchema: configIdInputSchema,
|
|
121
|
+
outputSchema: toolOutputSchema,
|
|
122
|
+
annotations: {
|
|
123
|
+
readOnlyHint: false,
|
|
124
|
+
destructiveHint: false,
|
|
125
|
+
idempotentHint: false,
|
|
126
|
+
openWorldHint: true
|
|
127
|
+
},
|
|
128
|
+
_meta: appToolMeta
|
|
129
|
+
}, withToolErrors(buildWheelTransactionTool));
|
|
130
|
+
registerAppTool(server, "build_range_transaction", {
|
|
131
|
+
title: "Build Range Transaction",
|
|
132
|
+
description: "Build, dry-run, or inspect an unsigned Suigar range transaction.",
|
|
133
|
+
inputSchema: rangeInputSchema,
|
|
134
|
+
outputSchema: toolOutputSchema,
|
|
135
|
+
annotations: {
|
|
136
|
+
readOnlyHint: false,
|
|
137
|
+
destructiveHint: false,
|
|
138
|
+
idempotentHint: false,
|
|
139
|
+
openWorldHint: true
|
|
140
|
+
},
|
|
141
|
+
_meta: appToolMeta
|
|
142
|
+
}, withToolErrors(buildRangeTransactionTool));
|
|
143
|
+
registerAppTool(server, "build_pvp_coinflip_create_transaction", {
|
|
144
|
+
title: "Build PvP Coinflip Create",
|
|
145
|
+
description: "Build, dry-run, or inspect an unsigned Suigar PvP coinflip lobby creation transaction.",
|
|
146
|
+
inputSchema: pvpCoinflipCreateInputSchema,
|
|
147
|
+
outputSchema: toolOutputSchema,
|
|
148
|
+
annotations: {
|
|
149
|
+
readOnlyHint: false,
|
|
150
|
+
destructiveHint: false,
|
|
151
|
+
idempotentHint: false,
|
|
152
|
+
openWorldHint: true
|
|
153
|
+
},
|
|
154
|
+
_meta: appToolMeta
|
|
155
|
+
}, withToolErrors(buildPvpCoinflipCreateTransactionTool));
|
|
156
|
+
registerAppTool(server, "build_pvp_coinflip_join_transaction", {
|
|
157
|
+
title: "Build PvP Coinflip Join",
|
|
158
|
+
description: "Build, dry-run, or inspect an unsigned Suigar PvP coinflip join transaction.",
|
|
159
|
+
inputSchema: pvpCoinflipJoinInputSchema,
|
|
160
|
+
outputSchema: toolOutputSchema,
|
|
161
|
+
annotations: {
|
|
162
|
+
readOnlyHint: false,
|
|
163
|
+
destructiveHint: false,
|
|
164
|
+
idempotentHint: false,
|
|
165
|
+
openWorldHint: true
|
|
166
|
+
},
|
|
167
|
+
_meta: appToolMeta
|
|
168
|
+
}, withToolErrors(buildPvpCoinflipJoinTransactionTool));
|
|
169
|
+
registerAppTool(server, "build_pvp_coinflip_cancel_transaction", {
|
|
170
|
+
title: "Build PvP Coinflip Cancel",
|
|
171
|
+
description: "Build, dry-run, or inspect an unsigned Suigar PvP coinflip cancel transaction.",
|
|
172
|
+
inputSchema: pvpCoinflipCancelInputSchema,
|
|
173
|
+
outputSchema: toolOutputSchema,
|
|
174
|
+
annotations: {
|
|
175
|
+
readOnlyHint: false,
|
|
176
|
+
destructiveHint: false,
|
|
177
|
+
idempotentHint: false,
|
|
178
|
+
openWorldHint: true
|
|
179
|
+
},
|
|
180
|
+
_meta: appToolMeta
|
|
181
|
+
}, withToolErrors(buildPvpCoinflipCancelTransactionTool));
|
|
182
|
+
return server;
|
|
183
|
+
};
|
|
184
|
+
const startSuigarMcpServer = async () => {
|
|
185
|
+
const server = createSuigarMcpServer();
|
|
186
|
+
const transport = new StdioServerTransport();
|
|
187
|
+
await server.connect(transport);
|
|
188
|
+
};
|
|
189
|
+
//#endregion
|
|
190
|
+
export { SUIGAR_MCP_APP_RESOURCE_URI, createSuigarMcpAppResourceResult, createSuigarMcpServer, readSuigarMcpAppHtml, startSuigarMcpServer };
|
|
191
|
+
|
|
192
|
+
//# sourceMappingURL=server.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.mjs","names":[],"sources":["../src/server.ts"],"sourcesContent":["// Copyright (c) Suigar\n// SPDX-License-Identifier: Apache-2.0\n\nimport { readFileSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport {\n\tregisterAppResource,\n\tregisterAppTool,\n\tRESOURCE_MIME_TYPE,\n} from '@modelcontextprotocol/ext-apps/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n\tcoinflipInputSchema,\n\tconfigIdInputSchema,\n\tlimboInputSchema,\n\tpvpCoinflipCancelInputSchema,\n\tpvpCoinflipCreateInputSchema,\n\tpvpCoinflipJoinInputSchema,\n\trangeInputSchema,\n\treadConfigInputSchema,\n\treadGameMetadataInputSchema,\n\ttoolOutputSchema,\n} from './schemas.js';\nimport {\n\tbuildCoinflipTransactionTool,\n\tbuildLimboTransactionTool,\n\tbuildPlinkoTransactionTool,\n\tbuildPvpCoinflipCancelTransactionTool,\n\tbuildPvpCoinflipCreateTransactionTool,\n\tbuildPvpCoinflipJoinTransactionTool,\n\tbuildRangeTransactionTool,\n\tbuildWheelTransactionTool,\n\treadConfigTool,\n\treadGameMetadataTool,\n} from './tools.js';\nimport type { ToolTextResult } from './types.js';\n\nexport const SUIGAR_MCP_APP_RESOURCE_URI =\n\t'ui://suigar/transaction-inspector.html';\n\nconst packageJson = JSON.parse(\n\treadFileSync(new URL('../package.json', import.meta.url), 'utf8'),\n) as { version: string };\n\nconst errorText = (error: unknown) => {\n\tif (error instanceof Error) {\n\t\treturn `${error.name}: ${error.message}`;\n\t}\n\treturn String(error);\n};\n\nconst hasErrorCode = (\n\terror: unknown,\n\tcode: string,\n): error is Error & { code: string } =>\n\terror instanceof Error &&\n\t'code' in error &&\n\t(error as { code: unknown }).code === code;\n\nconst withToolErrors =\n\t<TInput>(handler: (input: TInput) => Promise<ToolTextResult>) =>\n\tasync (\n\t\tinput: TInput,\n\t): Promise<\n\t\t| ToolTextResult\n\t\t| { isError: true; content: [{ type: 'text'; text: string }] }\n\t> => {\n\t\ttry {\n\t\t\treturn await handler(input);\n\t\t} catch (error) {\n\t\t\treturn {\n\t\t\t\tisError: true,\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\ttext: `${errorText(error)}\\n\\nCheck required fields, network, coin type, and SDK config overrides. The MCP server only builds unsigned transactions and never signs or executes them.`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t};\n\nexport const readSuigarMcpAppHtml = async () => {\n\ttry {\n\t\treturn await readFile(new URL('./app/index.html', import.meta.url), 'utf8');\n\t} catch (error) {\n\t\tif (!hasErrorCode(error, 'ENOENT')) {\n\t\t\tthrow error;\n\t\t}\n\t\tthrow new Error('Unable to find bundled Suigar MCP App HTML.', {\n\t\t\tcause: error,\n\t\t});\n\t}\n};\n\nexport const createSuigarMcpAppResourceResult = async () => ({\n\tcontents: [\n\t\t{\n\t\t\turi: SUIGAR_MCP_APP_RESOURCE_URI,\n\t\t\tmimeType: RESOURCE_MIME_TYPE,\n\t\t\ttext: await readSuigarMcpAppHtml(),\n\t\t\t_meta: {\n\t\t\t\tui: {\n\t\t\t\t\tcsp: {\n\t\t\t\t\t\tconnectDomains: [],\n\t\t\t\t\t\tresourceDomains: [],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t],\n});\n\nexport const createSuigarMcpServer = () => {\n\tconst server = new McpServer({\n\t\tname: 'suigar',\n\t\tversion: packageJson.version,\n\t});\n\n\tserver.registerTool(\n\t\t'read_config',\n\t\t{\n\t\t\ttitle: 'Read Suigar Config',\n\t\t\tdescription:\n\t\t\t\t'Resolve Suigar SDK config for mainnet or testnet. Defaults to testnet.',\n\t\t\tinputSchema: readConfigInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: true,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: true,\n\t\t\t\topenWorldHint: false,\n\t\t\t},\n\t\t},\n\t\twithToolErrors(readConfigTool),\n\t);\n\n\tregisterAppResource(\n\t\tserver,\n\t\t'Suigar Transaction Inspector',\n\t\tSUIGAR_MCP_APP_RESOURCE_URI,\n\t\t{\n\t\t\tdescription:\n\t\t\t\t'Compact MCP App UI for inspecting Suigar config, transaction plans, summaries, dry-runs, and serialized bytes.',\n\t\t},\n\t\tcreateSuigarMcpAppResourceResult,\n\t);\n\n\tconst appToolMeta = {\n\t\tui: {\n\t\t\tresourceUri: SUIGAR_MCP_APP_RESOURCE_URI,\n\t\t},\n\t};\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'read_game_metadata',\n\t\t{\n\t\t\ttitle: 'Read Suigar Game Metadata',\n\t\t\tdescription:\n\t\t\t\t'Read SDK-backed metadata for a supported Suigar game and coin type.',\n\t\t\tinputSchema: readGameMetadataInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: true,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: true,\n\t\t\t\topenWorldHint: false,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(readGameMetadataTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_coinflip_transaction',\n\t\t{\n\t\t\ttitle: 'Build Coinflip Transaction',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar coinflip transaction.',\n\t\t\tinputSchema: coinflipInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildCoinflipTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_limbo_transaction',\n\t\t{\n\t\t\ttitle: 'Build Limbo Transaction',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar limbo transaction.',\n\t\t\tinputSchema: limboInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildLimboTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_plinko_transaction',\n\t\t{\n\t\t\ttitle: 'Build Plinko Transaction',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar plinko transaction.',\n\t\t\tinputSchema: configIdInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildPlinkoTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_wheel_transaction',\n\t\t{\n\t\t\ttitle: 'Build Wheel Transaction',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar wheel transaction.',\n\t\t\tinputSchema: configIdInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildWheelTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_range_transaction',\n\t\t{\n\t\t\ttitle: 'Build Range Transaction',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar range transaction.',\n\t\t\tinputSchema: rangeInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildRangeTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_pvp_coinflip_create_transaction',\n\t\t{\n\t\t\ttitle: 'Build PvP Coinflip Create',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar PvP coinflip lobby creation transaction.',\n\t\t\tinputSchema: pvpCoinflipCreateInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildPvpCoinflipCreateTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_pvp_coinflip_join_transaction',\n\t\t{\n\t\t\ttitle: 'Build PvP Coinflip Join',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar PvP coinflip join transaction.',\n\t\t\tinputSchema: pvpCoinflipJoinInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildPvpCoinflipJoinTransactionTool),\n\t);\n\n\tregisterAppTool(\n\t\tserver,\n\t\t'build_pvp_coinflip_cancel_transaction',\n\t\t{\n\t\t\ttitle: 'Build PvP Coinflip Cancel',\n\t\t\tdescription:\n\t\t\t\t'Build, dry-run, or inspect an unsigned Suigar PvP coinflip cancel transaction.',\n\t\t\tinputSchema: pvpCoinflipCancelInputSchema,\n\t\t\toutputSchema: toolOutputSchema,\n\t\t\tannotations: {\n\t\t\t\treadOnlyHint: false,\n\t\t\t\tdestructiveHint: false,\n\t\t\t\tidempotentHint: false,\n\t\t\t\topenWorldHint: true,\n\t\t\t},\n\t\t\t_meta: appToolMeta,\n\t\t},\n\t\twithToolErrors(buildPvpCoinflipCancelTransactionTool),\n\t);\n\n\treturn server;\n};\n\nexport const startSuigarMcpServer = async () => {\n\tconst server = createSuigarMcpServer();\n\tconst transport = new StdioServerTransport();\n\tawait server.connect(transport);\n};\n"],"mappings":";;;;;;;;AAsCA,MAAa,8BACZ;AAED,MAAM,cAAc,KAAK,MACxB,aAAa,IAAI,IAAI,mBAAmB,OAAO,KAAK,GAAG,GAAG,MAAM,CACjE;AAEA,MAAM,aAAa,UAAmB;CACrC,IAAI,iBAAiB,OACpB,OAAO,GAAG,MAAM,KAAK,IAAI,MAAM;CAEhC,OAAO,OAAO,KAAK;AACpB;AAEA,MAAM,gBACL,OACA,SAEA,iBAAiB,SACjB,UAAU,SACT,MAA4B,SAAS;AAEvC,MAAM,kBACI,YACT,OACC,UAII;CACJ,IAAI;EACH,OAAO,MAAM,QAAQ,KAAK;CAC3B,SAAS,OAAO;EACf,OAAO;GACN,SAAS;GACT,SAAS,CACR;IACC,MAAM;IACN,MAAM,GAAG,UAAU,KAAK,EAAE;GAC3B,CACD;EACD;CACD;AACD;AAED,MAAa,uBAAuB,YAAY;CAC/C,IAAI;EACH,OAAO,MAAM,SAAS,IAAI,IAAI,oBAAoB,OAAO,KAAK,GAAG,GAAG,MAAM;CAC3E,SAAS,OAAO;EACf,IAAI,CAAC,aAAa,OAAO,QAAQ,GAChC,MAAM;EAEP,MAAM,IAAI,MAAM,+CAA+C,EAC9D,OAAO,MACR,CAAC;CACF;AACD;AAEA,MAAa,mCAAmC,aAAa,EAC5D,UAAU,CACT;CACC,KAAK;CACL,UAAU;CACV,MAAM,MAAM,qBAAqB;CACjC,OAAO,EACN,IAAI,EACH,KAAK;EACJ,gBAAgB,CAAC;EACjB,iBAAiB,CAAC;CACnB,EACD,EACD;AACD,CACD,EACD;AAEA,MAAa,8BAA8B;CAC1C,MAAM,SAAS,IAAI,UAAU;EAC5B,MAAM;EACN,SAAS,YAAY;CACtB,CAAC;CAED,OAAO,aACN,eACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;CACD,GACA,eAAe,cAAc,CAC9B;CAEA,oBACC,QACA,gCACA,6BACA,EACC,aACC,iHACF,GACA,gCACD;CAEA,MAAM,cAAc,EACnB,IAAI,EACH,aAAa,4BACd,EACD;CAEA,gBACC,QACA,sBACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,oBAAoB,CACpC;CAEA,gBACC,QACA,8BACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,4BAA4B,CAC5C;CAEA,gBACC,QACA,2BACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,yBAAyB,CACzC;CAEA,gBACC,QACA,4BACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,0BAA0B,CAC1C;CAEA,gBACC,QACA,2BACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,yBAAyB,CACzC;CAEA,gBACC,QACA,2BACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,yBAAyB,CACzC;CAEA,gBACC,QACA,yCACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,qCAAqC,CACrD;CAEA,gBACC,QACA,uCACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,mCAAmC,CACnD;CAEA,gBACC,QACA,yCACA;EACC,OAAO;EACP,aACC;EACD,aAAa;EACb,cAAc;EACd,aAAa;GACZ,cAAc;GACd,iBAAiB;GACjB,gBAAgB;GAChB,eAAe;EAChB;EACA,OAAO;CACR,GACA,eAAe,qCAAqC,CACrD;CAEA,OAAO;AACR;AAEA,MAAa,uBAAuB,YAAY;CAC/C,MAAM,SAAS,sBAAsB;CACrC,MAAM,YAAY,IAAI,qBAAqB;CAC3C,MAAM,OAAO,QAAQ,SAAS;AAC/B"}
|
package/dist/tools.d.mts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ToolTextResult } from "./types.mjs";
|
|
2
|
+
import { CoinflipInput, ConfigIdInput, LimboInput, PvpCoinflipCancelInput, PvpCoinflipCreateInput, PvpCoinflipJoinInput, RangeInput, ReadConfigInput, ReadGameMetadataInput } from "./schemas.mjs";
|
|
3
|
+
|
|
4
|
+
//#region src/tools.d.ts
|
|
5
|
+
declare const readConfigTool: (input?: ReadConfigInput) => Promise<ToolTextResult>;
|
|
6
|
+
declare const readGameMetadataTool: (input?: ReadGameMetadataInput) => Promise<ToolTextResult>;
|
|
7
|
+
declare const buildCoinflipTransactionTool: (input?: CoinflipInput) => Promise<ToolTextResult>;
|
|
8
|
+
declare const buildLimboTransactionTool: (input?: LimboInput) => Promise<ToolTextResult>;
|
|
9
|
+
declare const buildPlinkoTransactionTool: (input?: ConfigIdInput) => Promise<ToolTextResult>;
|
|
10
|
+
declare const buildWheelTransactionTool: (input?: ConfigIdInput) => Promise<ToolTextResult>;
|
|
11
|
+
declare const buildRangeTransactionTool: (input?: RangeInput) => Promise<ToolTextResult>;
|
|
12
|
+
declare const buildPvpCoinflipCreateTransactionTool: (input?: PvpCoinflipCreateInput) => Promise<ToolTextResult>;
|
|
13
|
+
declare const buildPvpCoinflipJoinTransactionTool: (input?: PvpCoinflipJoinInput) => Promise<ToolTextResult>;
|
|
14
|
+
declare const buildPvpCoinflipCancelTransactionTool: (input?: PvpCoinflipCancelInput) => Promise<ToolTextResult>;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { buildCoinflipTransactionTool, buildLimboTransactionTool, buildPlinkoTransactionTool, buildPvpCoinflipCancelTransactionTool, buildPvpCoinflipCreateTransactionTool, buildPvpCoinflipJoinTransactionTool, buildRangeTransactionTool, buildWheelTransactionTool, readConfigTool, readGameMetadataTool };
|
|
17
|
+
//# sourceMappingURL=tools.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.mts","names":[],"sources":["../src/tools.ts"],"mappings":";;;;cAmVa,cAAA,GAAwB,KAAA,GAAO,eAAA,KAAoB,OAAA,CAAA,cAAA;AAAA,cASnD,oBAAA,GACZ,KAAA,GAAO,qBAAA,KAA0B,OAAA,CAAA,cAAA;AAAA,cA0BrB,4BAAA,GACZ,KAAA,GAAO,aAAA,KAAkB,OAAA,CAAA,cAAA;AAAA,cA6Bb,yBAAA,GAAmC,KAAA,GAAO,UAAA,KAAe,OAAA,CAAA,cAAA;AAAA,cA4DzD,0BAAA,GAA8B,KAAA,GAAO,aAAA,KAAkB,OAAA,CAAA,cAAA;AAAA,cAGvD,yBAAA,GAA6B,KAAA,GAAO,aAAA,KAAkB,OAAA,CAAA,cAAA;AAAA,cAGtD,yBAAA,GAAmC,KAAA,GAAO,UAAA,KAAe,OAAA,CAAA,cAAA;AAAA,cAgCzD,qCAAA,GACZ,KAAA,GAAO,sBAAA,KAA2B,OAAA,CAAA,cAAA;AAAA,cA2CtB,mCAAA,GACZ,KAAA,GAAO,oBAAA,KAAyB,OAAA,CAAA,cAAA;AAAA,cA8BpB,qCAAA,GACZ,KAAA,GAAO,sBAAA,KAA2B,OAAA,CAAA,cAAA"}
|