phygital-token-mcp 0.1.1

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 (40) hide show
  1. package/README.md +59 -0
  2. package/cursor-mcp.example.json +8 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +481 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/docs.d.ts +17 -0
  7. package/dist/lib/docs.js +121 -0
  8. package/dist/lib/docs.js.map +1 -0
  9. package/dist/lib/format.d.ts +13 -0
  10. package/dist/lib/format.js +12 -0
  11. package/dist/lib/format.js.map +1 -0
  12. package/dist/lib/gating-json.d.ts +127 -0
  13. package/dist/lib/gating-json.js +346 -0
  14. package/dist/lib/gating-json.js.map +1 -0
  15. package/dist/lib/graphify.d.ts +2 -0
  16. package/dist/lib/graphify.js +35 -0
  17. package/dist/lib/graphify.js.map +1 -0
  18. package/dist/lib/instructions.d.ts +131 -0
  19. package/dist/lib/instructions.js +232 -0
  20. package/dist/lib/instructions.js.map +1 -0
  21. package/dist/lib/paths.d.ts +14 -0
  22. package/dist/lib/paths.js +77 -0
  23. package/dist/lib/paths.js.map +1 -0
  24. package/dist/lib/rpc.d.ts +3 -0
  25. package/dist/lib/rpc.js +22 -0
  26. package/dist/lib/rpc.js.map +1 -0
  27. package/dist/lib/sdk-surface.d.ts +33 -0
  28. package/dist/lib/sdk-surface.js +101 -0
  29. package/dist/lib/sdk-surface.js.map +1 -0
  30. package/dist/lib/verification.d.ts +43 -0
  31. package/dist/lib/verification.js +166 -0
  32. package/dist/lib/verification.js.map +1 -0
  33. package/docs/building-on-phygital/overview.md +46 -0
  34. package/docs/building-on-phygital/rust-cpi.md +55 -0
  35. package/docs/glossary.md +43 -0
  36. package/docs/sdk/surface-area.md +77 -0
  37. package/docs/verification/methods.md +58 -0
  38. package/docs/verification/overview.md +70 -0
  39. package/docs/verification/verify-asset-composable.md +97 -0
  40. package/package.json +52 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # phygital-token MCP Server
2
+
3
+ [Model Context Protocol](https://modelcontextprotocol.io) server for the phygital-token Solana program, TypeScript SDK, and Rust client.
4
+
5
+ **Docs, schema reference, and offline planning only** — no live RPC or on-chain calls. Use [`phygital-token-sdk`](https://www.npmjs.com/package/phygital-token-sdk) in your app for `evaluateAssetGating`, `fetchAssetDisplayInfo`, and transaction building.
6
+
7
+ ## Install
8
+
9
+ Add to Cursor MCP config (`~/.cursor/mcp.json` or project `.cursor/mcp.json`):
10
+
11
+ ```json
12
+ {
13
+ "mcpServers": {
14
+ "phygital-token": {
15
+ "command": "npx",
16
+ "args": ["-y", "phygital-token-mcp"]
17
+ }
18
+ }
19
+ }
20
+ ```
21
+
22
+ Requires **Node.js 20+**. See [`cursor-mcp.example.json`](./cursor-mcp.example.json).
23
+
24
+ ## Tools
25
+
26
+ | Area | Tools |
27
+ |------|-------|
28
+ | **Docs** | `search_docs`, `read_doc`, `list_docs` |
29
+ | **Gating** | `explain_gating`, `gating_filter_schema`, `gating_recipe`, `format_gating_predicate`, `summarize_gating_result` |
30
+ | **Verification** | `recommend_verification`, `plan_verify_asset`, `explain_verification` |
31
+ | **Planning** | `plan_create_mint`, `plan_mint_token`, `plan_transfer`, `find_asset_pda` |
32
+ | **SDK** | `list_sdk_exports` |
33
+
34
+ ## Optional: monorepo contributors
35
+
36
+ ```bash
37
+ pnpm install
38
+ pnpm --filter phygital-token-sdk build
39
+ pnpm --filter phygital-token-mcp build
40
+ ```
41
+
42
+ **Contributor-only** (repo clone + `PHYGITAL_TOKEN_REPO_ROOT`):
43
+
44
+ | Tool | Requires |
45
+ |------|----------|
46
+ | `query_codebase` | `graphify` CLI + `graphify update .` in the repo |
47
+ | `read_sdk_source` | Cloned repo or `PHYGITAL_TOKEN_REPO_ROOT` |
48
+
49
+ ## Publish
50
+
51
+ ```bash
52
+ cd mcp/phygital-token
53
+ pnpm build
54
+ npm publish --access public
55
+ ```
56
+
57
+ ## License
58
+
59
+ ISC
@@ -0,0 +1,8 @@
1
+ {
2
+ "mcpServers": {
3
+ "phygital-token": {
4
+ "command": "npx",
5
+ "args": ["-y", "phygital-token-mcp"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,481 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { findAssetPda, formatGatingPredicate, parseSecp256r1Pubkey, summarizeGatingEvaluationFailure, summarizeGatingFailure, } from "phygital-token-sdk";
5
+ import { z } from "zod";
6
+ import { listDocs, readDocById, searchDocs } from "./lib/docs.js";
7
+ import { jsonResult, textResult } from "./lib/format.js";
8
+ import { GATING_FILTER_SCHEMA, GATING_OVERVIEW, GATING_RECIPES, GATING_TIER_EXAMPLE, getGatingRecipe, } from "./lib/gating-json.js";
9
+ import { runGraphify } from "./lib/graphify.js";
10
+ import { parseAssetType, planCreateMint, planMintToken, planTransfer, planVerifyAsset, } from "./lib/instructions.js";
11
+ import { SDK_SURFACE, readSourceExcerpt } from "./lib/sdk-surface.js";
12
+ import { ON_CHAIN_PATTERNS, VERIFICATION_DECISION_TREE, listVerificationUseCases, recommendVerification, } from "./lib/verification.js";
13
+ const SERVER_INSTRUCTIONS = [
14
+ "MCP server for the phygital-token Solana program, TypeScript SDK, and Rust client.",
15
+ "Docs, schema reference, and offline planning only — no live on-chain RPC calls.",
16
+ "",
17
+ "Routing:",
18
+ "- Which verification to use → recommend_verification or explain_verification",
19
+ "- Composable verify_asset → plan_verify_asset, read_doc verify-asset-composable",
20
+ "- Building on phygital (CPI) → read_doc building-on-phygital/*, rust_cpi_verify_asset_guide",
21
+ "- SDK export map → list_sdk_exports",
22
+ "- Gating rules → explain_gating, gating_filter_schema, gating_recipe, format_gating_predicate",
23
+ "- Mint / transfer flows → plan_create_mint, plan_mint_token, plan_transfer",
24
+ "- Code architecture (repo clone) → query_codebase (graphify)",
25
+ "",
26
+ "Live gating evaluation and asset fetch: use phygital-token-sdk in your app (evaluateAssetGating, fetchAssetDisplayInfo).",
27
+ "query_codebase and read_sdk_source need PHYGITAL_TOKEN_REPO_ROOT when not running from a clone.",
28
+ ].join("\n");
29
+ function registerTools(server) {
30
+ server.tool("search_docs", "Search phygital-token docs: gating, verification, building-on-phygital, SDK surface, glossary.", {
31
+ query: z.string().describe("Natural-language or keyword search query"),
32
+ limit: z.number().int().min(1).max(20).optional().describe("Max results (default 8)"),
33
+ }, async ({ query, limit }) => {
34
+ const results = await searchDocs(query, limit ?? 8);
35
+ return jsonResult({ query, results });
36
+ });
37
+ server.tool("read_doc", "Read a full documentation file by id from search_docs results.", {
38
+ docId: z.string().describe('Document id, e.g. "gating:overview" or "verification:overview"'),
39
+ }, async ({ docId }) => textResult(await readDocById(docId)));
40
+ server.tool("list_docs", "List all available phygital-token documentation resources.", {}, async () => jsonResult({ docs: await listDocs() }));
41
+ server.tool("query_codebase", "Query the phygital-token knowledge graph via graphify (architecture, call paths, concepts). Requires a repo clone.", {
42
+ question: z.string().describe("Natural-language question about the codebase"),
43
+ mode: z
44
+ .enum(["query", "explain", "path"])
45
+ .optional()
46
+ .describe("query=BFS context (default), explain=concept summary, path=shortest path between two nodes"),
47
+ from: z.string().optional().describe('Required for mode=path: start concept/node name'),
48
+ to: z.string().optional().describe('Required for mode=path: end concept/node name'),
49
+ }, async ({ question, mode = "query", from, to }) => {
50
+ if (mode === "path") {
51
+ if (!from || !to) {
52
+ throw new Error('mode "path" requires both from and to.');
53
+ }
54
+ const output = await runGraphify("path", [from, to]);
55
+ return textResult(output);
56
+ }
57
+ if (mode === "explain") {
58
+ const output = await runGraphify("explain", [question]);
59
+ return textResult(output);
60
+ }
61
+ const output = await runGraphify("query", [question]);
62
+ return textResult(output);
63
+ });
64
+ server.tool("find_asset_pda", "Derive the on-chain asset PDA address from a secp256r1 passkey public key (offline).", {
65
+ assetPublicKey: z
66
+ .string()
67
+ .describe("Base64url-encoded secp256r1 public key for the phygital asset"),
68
+ }, async ({ assetPublicKey }) => {
69
+ const pubkey = parseSecp256r1Pubkey(assetPublicKey);
70
+ const assetPda = await findAssetPda(pubkey);
71
+ return jsonResult({ assetPublicKey, assetPda });
72
+ });
73
+ server.tool("gating_tier_example", "Return a copy-paste JSON example for evaluateAssetGating tier configuration.", {}, async () => jsonResult({ tiers: GATING_TIER_EXAMPLE }));
74
+ server.tool("explain_gating", "Gating mental model: dimensions, flow, aggregations, same-asset vs wallet pitfalls, doc index.", {}, async () => jsonResult(GATING_OVERVIEW));
75
+ server.tool("gating_filter_schema", "JSON schema reference for GatingFilter trees, predicates, traits, and SDK builders.", {}, async () => jsonResult(GATING_FILTER_SCHEMA));
76
+ server.tool("list_gating_recipes", "List copy-paste gating recipes (filters, tiers, and common footguns).", {
77
+ includeFootguns: z
78
+ .boolean()
79
+ .optional()
80
+ .describe("Include anti-pattern / footgun recipes (default true)"),
81
+ }, async ({ includeFootguns = true }) => jsonResult({
82
+ recipes: GATING_RECIPES.filter((r) => includeFootguns || !r.footgun).map(({ id, title, description, footgun }) => ({
83
+ id,
84
+ title,
85
+ description,
86
+ footgun: footgun ?? false,
87
+ })),
88
+ }));
89
+ server.tool("gating_recipe", "Return a gating recipe by id (JSON filter or tiers for evaluateAssetGating).", {
90
+ recipeId: z.string().describe("Recipe id from list_gating_recipes"),
91
+ }, async ({ recipeId }) => jsonResult(getGatingRecipe(recipeId)));
92
+ server.tool("summarize_gating_result", "Human-readable failure reasons from evaluateAssetGating output (pass the SDK result JSON).", {
93
+ evaluationJson: z.unknown().describe("JSON result from evaluateAssetGating"),
94
+ }, async ({ evaluationJson }) => {
95
+ const data = evaluationJson;
96
+ if (data.failureSummary && Array.isArray(data.failureSummary)) {
97
+ return jsonResult({ summary: data.failureSummary });
98
+ }
99
+ if (data.tiers && Array.isArray(data.tiers)) {
100
+ const summary = summarizeGatingEvaluationFailure(data);
101
+ return jsonResult({ summary });
102
+ }
103
+ if (data.filterResult) {
104
+ return jsonResult({
105
+ summary: summarizeGatingFailure(data.filterResult),
106
+ });
107
+ }
108
+ throw new Error("Unrecognized evaluation JSON. Pass output from evaluateAssetGating in your app.");
109
+ });
110
+ server.tool("format_gating_predicate", "Format a GatingAssetPredicate JSON object as a human-readable string.", {
111
+ predicate: z.unknown().describe("GatingAssetPredicate JSON"),
112
+ }, async ({ predicate }) => {
113
+ if (!predicate || typeof predicate !== "object") {
114
+ throw new Error("predicate must be a JSON object");
115
+ }
116
+ return jsonResult({
117
+ formatted: formatGatingPredicate(predicate),
118
+ });
119
+ });
120
+ server.tool("list_gating_docs", "List all gating documentation doc ids (overview, predicates, recipes, etc.).", {}, async () => {
121
+ const docs = await listDocs();
122
+ return jsonResult({
123
+ docs: docs.filter((d) => d.category === "gating"),
124
+ });
125
+ });
126
+ server.tool("plan_create_mint", "Validate metadata and return accounts/signers needed for create_mint (buildCreateMintInstructions).", {
127
+ name: z.string().describe("Token metadata name (max 32 chars)"),
128
+ symbol: z.string().describe("Token metadata symbol (max 10 chars)"),
129
+ uri: z.string().describe("Metadata URI (max 200 chars)"),
130
+ }, async ({ name, symbol, uri }) => jsonResult(planCreateMint({ name, symbol, uri })));
131
+ server.tool("plan_mint_token", "Derive accounts and list signers/inputs for mint_token (buildMintTokenInstructions).", {
132
+ assetPublicKey: z
133
+ .string()
134
+ .describe("Base64url-encoded secp256r1 public key for the new asset"),
135
+ mint: z.string().describe("Design mint address"),
136
+ assetType: z
137
+ .enum(["Lockable", "Transferable"])
138
+ .describe("Asset transfer lock behavior"),
139
+ credentialId: z
140
+ .string()
141
+ .optional()
142
+ .describe("Base64url passkey credential id (for reference in plan output)"),
143
+ }, async ({ assetPublicKey, mint, assetType, credentialId }) => jsonResult(await planMintToken({
144
+ assetPublicKey,
145
+ mint,
146
+ assetType: parseAssetType(assetType),
147
+ credentialId,
148
+ })));
149
+ server.tool("plan_transfer", "Plan a passkey-authorized transfer: flow steps, derived accounts, and challenge formula (offline).", {
150
+ assetPublicKey: z
151
+ .string()
152
+ .describe("Base64url-encoded secp256r1 public key for the phygital asset"),
153
+ recipient: z.string().describe("Recipient wallet address"),
154
+ mint: z
155
+ .string()
156
+ .optional()
157
+ .describe("Design mint address — enables ATA derivation when combined with currentOwner"),
158
+ currentOwner: z
159
+ .string()
160
+ .optional()
161
+ .describe("Current asset owner wallet — enables ATA derivation when combined with mint"),
162
+ }, async ({ assetPublicKey, recipient, mint, currentOwner }) => jsonResult(await planTransfer({ assetPublicKey, recipient, mint, currentOwner })));
163
+ server.tool("recommend_verification", "Recommend which SDK verification method to use for a specific use case (identification vs authentication).", {
164
+ useCase: z.enum([
165
+ "product_page_lookup",
166
+ "deep_link_from_prior_scan",
167
+ "offline_identification",
168
+ "login_ui_only",
169
+ "onchain_standalone_verify",
170
+ "onchain_inspect_verify_asset",
171
+ "onchain_cpi_verify_asset",
172
+ "transfer_ownership",
173
+ "wallet_holdings_gate",
174
+ "native_mobile_app",
175
+ ]),
176
+ }, async ({ useCase }) => jsonResult(recommendVerification(useCase)));
177
+ server.tool("list_verification_use_cases", "List all supported verification use cases for recommend_verification.", {}, async () => jsonResult({
178
+ useCases: listVerificationUseCases(),
179
+ decisionTree: VERIFICATION_DECISION_TREE,
180
+ }));
181
+ server.tool("explain_verification", "Explain identification vs authentication and all verify.ts methods. Returns decision tree + doc pointers.", {}, async () => jsonResult({
182
+ decisionTree: VERIFICATION_DECISION_TREE,
183
+ useCases: listVerificationUseCases(),
184
+ onChainPatterns: ON_CHAIN_PATTERNS,
185
+ methods: {
186
+ identification: ["verifyDynamicUrl", "verifyDynamicUrlWithoutCounterCheck"],
187
+ authenticationOffChain: [
188
+ "verifyWithChallengeResponse",
189
+ "verifyWithChallengeResponseOverNfc",
190
+ ],
191
+ onChainComposable: [
192
+ "beginVerifyAsset",
193
+ "buildVerifyAssetArgs",
194
+ "completeVerifyAsset",
195
+ ],
196
+ transfer: ["beginTransfer", "completeTransfer"],
197
+ },
198
+ docIds: [
199
+ "verification:overview",
200
+ "verification:methods",
201
+ "verification:verify-asset-composable",
202
+ "building-on-phygital:overview",
203
+ ],
204
+ }));
205
+ server.tool("plan_verify_asset", "Plan on-chain verify_asset flow (offline). Pattern A: client posts verify_asset. Pattern B: program CPIs.", {
206
+ message: z
207
+ .string()
208
+ .describe("UTF-8 message bytes bound into the on-chain proof (embed domain-specific payload for your program)"),
209
+ onChainPattern: z
210
+ .enum(["inspect", "cpi", "standalone"])
211
+ .optional()
212
+ .describe("inspect = Pattern A. cpi = Pattern B. standalone = verify_asset only."),
213
+ assetPublicKey: z
214
+ .string()
215
+ .optional()
216
+ .describe("Optional base64url secp256r1 pubkey to pre-derive asset PDA"),
217
+ }, async ({ message, onChainPattern, assetPublicKey }) => jsonResult(await planVerifyAsset({
218
+ message,
219
+ assetPublicKey,
220
+ onChainPattern: onChainPattern ?? "inspect",
221
+ })));
222
+ server.tool("list_sdk_exports", "List all major phygital-token TypeScript SDK exports and Rust client CPI types.", {}, async () => jsonResult(SDK_SURFACE));
223
+ server.tool("read_sdk_source", "Read an excerpt from key SDK source files (requires PHYGITAL_TOKEN_REPO_ROOT or monorepo clone).", {
224
+ file: z.enum(["verify.ts", "verifyAsset.ts", "rust_verify_asset.rs"]),
225
+ maxLines: z.number().int().min(20).max(300).optional(),
226
+ }, async ({ file, maxLines }) => jsonResult(await readSourceExcerpt(file, maxLines ?? 120)));
227
+ server.tool("rust_cpi_verify_asset_guide", "Guide for building on verify_asset: Pattern A (inspect sysvar) or Pattern B (CPI) using phygital-token-client.", {
228
+ pattern: z
229
+ .enum(["inspect", "cpi"])
230
+ .optional()
231
+ .describe("inspect = Pattern A. cpi = Pattern B."),
232
+ }, async ({ pattern = "inspect" }) => jsonResult({
233
+ pattern,
234
+ ...(pattern === "inspect" ? ON_CHAIN_PATTERNS.inspect : ON_CHAIN_PATTERNS.cpi),
235
+ rustCrate: "phygital-token-client",
236
+ path: "clients/rust/phygital-token",
237
+ dependency: 'phygital-token-client = { version = "0.1", features = ["anchor"] }',
238
+ cpiTypes: ["VerifyAssetCpiBuilder", "VerifyAssetInstructionArgs", "Secp256r1VerifyArgs"],
239
+ clientTypeScript: pattern === "inspect"
240
+ ? ["beginVerifyAsset", "completeVerifyAsset", "getVerifyAssetInstruction"]
241
+ : ["beginVerifyAsset", "buildVerifyAssetArgs"],
242
+ messageBinding: "Client and your program must agree on exact message bytes passed to beginVerifyAsset",
243
+ referenceImplementation: pattern === "inspect"
244
+ ? "programs/phygital-spend — require_matching_verify_asset"
245
+ : "clients/rust/phygital-token — VerifyAssetCpiBuilder",
246
+ docIds: ["building-on-phygital:overview", "building-on-phygital:rust-cpi"],
247
+ testing: "programs/phygital-token/tests/verify_asset_flow.rs",
248
+ note: "verifyWithChallengeResponse accepts optional message (off-chain challenge binding only). On-chain message binding uses beginVerifyAsset.",
249
+ }));
250
+ }
251
+ function registerResources(server) {
252
+ server.resource("verification-overview", "phygital://docs/verification/overview", {
253
+ description: "Identification vs authentication — when to use which verification method",
254
+ mimeType: "text/markdown",
255
+ }, async () => ({
256
+ contents: [
257
+ {
258
+ uri: "phygital://docs/verification/overview",
259
+ mimeType: "text/markdown",
260
+ text: await readDocById("verification:overview"),
261
+ },
262
+ ],
263
+ }));
264
+ server.resource("verify-asset-composable", "phygital://docs/verification/verify-asset-composable", {
265
+ description: "Composable verify_asset flow — buildVerifyAssetArgs and transaction layout",
266
+ mimeType: "text/markdown",
267
+ }, async () => ({
268
+ contents: [
269
+ {
270
+ uri: "phygital://docs/verification/verify-asset-composable",
271
+ mimeType: "text/markdown",
272
+ text: await readDocById("verification:verify-asset-composable"),
273
+ },
274
+ ],
275
+ }));
276
+ server.resource("building-on-phygital", "phygital://docs/building-on-phygital/overview", {
277
+ description: "Guide for third-party developers building on phygital assets",
278
+ mimeType: "text/markdown",
279
+ }, async () => ({
280
+ contents: [
281
+ {
282
+ uri: "phygital://docs/building-on-phygital/overview",
283
+ mimeType: "text/markdown",
284
+ text: await readDocById("building-on-phygital:overview"),
285
+ },
286
+ ],
287
+ }));
288
+ server.resource("gating-overview", "phygital://docs/gating/overview", {
289
+ description: "Gating overview — mental model, dimensions, and tier evaluation flow",
290
+ mimeType: "text/markdown",
291
+ }, async () => ({
292
+ contents: [
293
+ {
294
+ uri: "phygital://docs/gating/overview",
295
+ mimeType: "text/markdown",
296
+ text: await readDocById("gating:overview"),
297
+ },
298
+ ],
299
+ }));
300
+ server.resource("gating-recipes", "phygital://docs/gating/recipes", {
301
+ description: "Gating copy-paste recipes and footguns",
302
+ mimeType: "text/markdown",
303
+ }, async () => ({
304
+ contents: [
305
+ {
306
+ uri: "phygital://docs/gating/recipes",
307
+ mimeType: "text/markdown",
308
+ text: await readDocById("gating:recipes"),
309
+ },
310
+ ],
311
+ }));
312
+ server.resource("gating-predicates", "phygital://docs/gating/predicates", {
313
+ description: "Gating predicates — collection, mint, traits, balance operators",
314
+ mimeType: "text/markdown",
315
+ }, async () => ({
316
+ contents: [
317
+ {
318
+ uri: "phygital://docs/gating/predicates",
319
+ mimeType: "text/markdown",
320
+ text: await readDocById("gating:predicates"),
321
+ },
322
+ ],
323
+ }));
324
+ server.resource("gating-evaluation", "phygital://docs/gating/evaluation-and-errors", {
325
+ description: "Gating evaluation results and debugging failures",
326
+ mimeType: "text/markdown",
327
+ }, async () => ({
328
+ contents: [
329
+ {
330
+ uri: "phygital://docs/gating/evaluation-and-errors",
331
+ mimeType: "text/markdown",
332
+ text: await readDocById("gating:evaluation-and-errors"),
333
+ },
334
+ ],
335
+ }));
336
+ server.resource("glossary", "phygital://glossary", {
337
+ description: "Phygital Token domain glossary (collection, design, asset, custody)",
338
+ mimeType: "text/markdown",
339
+ }, async () => ({
340
+ contents: [
341
+ {
342
+ uri: "phygital://glossary",
343
+ mimeType: "text/markdown",
344
+ text: await readDocById("glossary"),
345
+ },
346
+ ],
347
+ }));
348
+ }
349
+ function registerPrompts(server) {
350
+ server.prompt("choose_verification_method", "Help pick the right phygital verification approach for a product requirement", {
351
+ requirement: z
352
+ .string()
353
+ .describe("What you are trying to accomplish (e.g. unlock VIP door, product page, custom spend program)"),
354
+ needsOnChainProof: z.boolean().optional(),
355
+ onChainPattern: z.enum(["inspect", "cpi"]).optional(),
356
+ isNativeApp: z.boolean().optional(),
357
+ hasPriorScanUrl: z.boolean().optional(),
358
+ }, async ({ requirement, needsOnChainProof, onChainPattern, isNativeApp, hasPriorScanUrl }) => ({
359
+ messages: [
360
+ {
361
+ role: "user",
362
+ content: {
363
+ type: "text",
364
+ text: [
365
+ "Choose the right phygital-token verification method for:",
366
+ requirement,
367
+ needsOnChainProof != null ? `Needs on-chain proof: ${needsOnChainProof}` : "",
368
+ onChainPattern ? `On-chain pattern: ${onChainPattern}` : "",
369
+ isNativeApp != null ? `Native app: ${isNativeApp}` : "",
370
+ hasPriorScanUrl != null ? `Has prior scan URL params: ${hasPriorScanUrl}` : "",
371
+ "",
372
+ "verifyWithChallengeResponse is off-chain only (no verify_asset tx).",
373
+ "On-chain: Pattern A = client posts verify_asset, program inspects sysvar.",
374
+ "On-chain: Pattern B = buildVerifyAssetArgs, program CPIs verify_asset.",
375
+ "Use recommend_verification, explain_verification, plan_verify_asset.",
376
+ ]
377
+ .filter(Boolean)
378
+ .join("\n"),
379
+ },
380
+ },
381
+ ],
382
+ }));
383
+ server.prompt("build_composable_verify_asset_tx", "Design a composable transaction with verify_asset for a custom program", {
384
+ programAction: z.string().describe("What your program does after verify_asset (spend, unlock, claim, etc.)"),
385
+ onChainPattern: z
386
+ .enum(["inspect", "cpi"])
387
+ .describe("inspect = client posts verify_asset; cpi = program CPIs verify_asset"),
388
+ messageFormat: z.string().optional().describe("Proposed message byte format to bind authorization"),
389
+ }, async ({ programAction, onChainPattern, messageFormat }) => ({
390
+ messages: [
391
+ {
392
+ role: "user",
393
+ content: {
394
+ type: "text",
395
+ text: [
396
+ `Design a Pattern ${onChainPattern === "inspect" ? "A" : "B"} verify_asset transaction for:`,
397
+ programAction,
398
+ messageFormat ? `Message format: ${messageFormat}` : "",
399
+ "",
400
+ onChainPattern === "inspect"
401
+ ? "Pattern A: completeVerifyAsset + your ix; program inspects instructions sysvar."
402
+ : "Pattern B: buildVerifyAssetArgs + your ix; program CPIs verify_asset.",
403
+ "Use plan_verify_asset and read_doc building-on-phygital/rust-cpi.",
404
+ ]
405
+ .filter(Boolean)
406
+ .join("\n"),
407
+ },
408
+ },
409
+ ],
410
+ }));
411
+ server.prompt("design_gating_tiers", "Help design wallet gating tiers for a phygital experience", {
412
+ experience: z.string().describe("What you are gating (e.g. VIP lounge, premium content)"),
413
+ collections: z
414
+ .string()
415
+ .optional()
416
+ .describe("Collection mint addresses or descriptions"),
417
+ traits: z.string().optional().describe("NFT traits to consider"),
418
+ }, async ({ experience, collections, traits }) => ({
419
+ messages: [
420
+ {
421
+ role: "user",
422
+ content: {
423
+ type: "text",
424
+ text: [
425
+ "Design phygital-token gating tiers for this experience:",
426
+ experience,
427
+ collections ? `Collections: ${collections}` : "",
428
+ traits ? `Traits: ${traits}` : "",
429
+ "",
430
+ "Use the Gating filter tree (count, totalBalance, and/or/not).",
431
+ "Search docs with search_docs and return:",
432
+ "1) recommended tier ids",
433
+ "2) JSON tiers array for evaluateAssetGating in the SDK",
434
+ "3) pitfalls (same asset vs same wallet)",
435
+ ]
436
+ .filter(Boolean)
437
+ .join("\n"),
438
+ },
439
+ },
440
+ ],
441
+ }));
442
+ server.prompt("debug_gating_failure", "Explain why a gating evaluation failed and how to fix it", {
443
+ evaluationJson: z
444
+ .string()
445
+ .describe("JSON output from evaluateAssetGating or failureSummary field"),
446
+ }, async ({ evaluationJson }) => ({
447
+ messages: [
448
+ {
449
+ role: "user",
450
+ content: {
451
+ type: "text",
452
+ text: [
453
+ "Debug this phygital-token gating evaluation failure:",
454
+ evaluationJson,
455
+ "",
456
+ "Use search_docs on evaluation-and-errors and recipes.",
457
+ "Explain root cause in plain language and suggest a corrected filter tree.",
458
+ ].join("\n"),
459
+ },
460
+ },
461
+ ],
462
+ }));
463
+ }
464
+ async function main() {
465
+ const server = new McpServer({
466
+ name: "phygital-token",
467
+ version: "0.1.0",
468
+ }, {
469
+ instructions: SERVER_INSTRUCTIONS,
470
+ });
471
+ registerTools(server);
472
+ registerResources(server);
473
+ registerPrompts(server);
474
+ const transport = new StdioServerTransport();
475
+ await server.connect(transport);
476
+ }
477
+ main().catch((error) => {
478
+ console.error(error);
479
+ process.exit(1);
480
+ });
481
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export type DocCategory = "gating" | "verification" | "building-on-phygital" | "sdk" | "glossary" | "readme";
2
+ export type DocEntry = {
3
+ id: string;
4
+ title: string;
5
+ path: string;
6
+ category: DocCategory;
7
+ };
8
+ export declare function listDocs(): Promise<DocEntry[]>;
9
+ export declare function readDocById(docId: string): Promise<string>;
10
+ export type SearchDocsResult = {
11
+ id: string;
12
+ title: string;
13
+ category: string;
14
+ snippet: string;
15
+ score: number;
16
+ };
17
+ export declare function searchDocs(query: string, limit?: number): Promise<SearchDocsResult[]>;