@smartpolicy/mcp 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.
package/dist/server.js ADDED
@@ -0,0 +1,219 @@
1
+ /**
2
+ * SmartPolicy MCP server construction — all tool registrations live here.
3
+ * Transports (stdio in index.ts, Streamable HTTP in http.ts) call buildServer
4
+ * per connection/request; Registry and GrantIssuer are shared singletons
5
+ * (grant nonces are random and stateless, so sharing is safe).
6
+ */
7
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
+ import { isAddress } from "viem";
9
+ import { z } from "zod";
10
+ const addressSchema = z
11
+ .string()
12
+ .refine(isAddress, "must be a 0x-prefixed Ethereum address")
13
+ .transform((value) => value);
14
+ // NOTE: no z.bigint() here — bigint cannot be expressed in JSON Schema and
15
+ // silently breaks tools/list serialization in the MCP SDK.
16
+ const policyIdSchema = z
17
+ .union([z.string().regex(/^\d+$/), z.number().int().positive()])
18
+ .describe("Policy ID as decimal string or integer");
19
+ const toPolicyId = (value) => BigInt(value);
20
+ const actionSchema = z
21
+ .string()
22
+ .min(1)
23
+ .describe('Action name (e.g. "withdraw") or 0x-prefixed bytes32. Names are keccak256-hashed, matching keccak256("withdraw") in the protected contract.');
24
+ function json(result) {
25
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
26
+ }
27
+ function jsonError(error) {
28
+ return {
29
+ content: [{ type: "text", text: JSON.stringify({ error: error instanceof Error ? error.message : String(error) }) }],
30
+ isError: true,
31
+ };
32
+ }
33
+ export function buildServer(config, registry, issuer) {
34
+ const server = new McpServer({ name: "smartpolicy", version: "0.1.0" }, {
35
+ instructions: "SmartPolicy answers one question everywhere: isAllowed(policyId, subject, action). " +
36
+ "Key facts for correct use: (1) ALWAYS read fees first (policy_fees) — write txs need an EXACT msg.value, " +
37
+ "overpaying reverts. (2) Conditions have NO on-chain teeth; only membership, per-action rules, expiry, " +
38
+ "and grants enforce. (3) A grant's subject must be the eventual msg.sender, and only the grant's `target` " +
39
+ "contract may consume it. (4) policy_create/policy_update return UNSIGNED txs for your wallet to sign — " +
40
+ "this server never holds user keys. Verify grants with grant_verify before broadcasting.",
41
+ });
42
+ server.registerTool("policy_check", {
43
+ description: "THE canonical SmartPolicy question: may `subject` perform `action` under policy `policyId`? " +
44
+ "Returns allowed (boolean) plus the reasons. Maps 1:1 to PolicyRegistry.isAllowed — " +
45
+ "a protected contract gives the identical answer on-chain. Free.",
46
+ inputSchema: {
47
+ policyId: policyIdSchema,
48
+ subject: addressSchema,
49
+ action: actionSchema,
50
+ },
51
+ }, async ({ policyId, subject, action }) => {
52
+ try {
53
+ return json(await registry.check(toPolicyId(policyId), subject, action));
54
+ }
55
+ catch (error) {
56
+ return jsonError(error);
57
+ }
58
+ });
59
+ server.registerTool("policy_get", {
60
+ description: "Read a policy: owner, expiry, active/locked state, membership mode, member count, metadata URI. Free.",
61
+ inputSchema: { policyId: policyIdSchema },
62
+ }, async ({ policyId }) => {
63
+ try {
64
+ return json(await registry.getPolicy(toPolicyId(policyId)));
65
+ }
66
+ catch (error) {
67
+ return jsonError(error);
68
+ }
69
+ });
70
+ server.registerTool("grant_issue", {
71
+ description: "Issue a short-lived single-use EIP-712 grant authorizing `subject` to perform `action` under " +
72
+ "`policyId`, redeemable ONLY at the `target` contract. The subject must pass policy_check first; the " +
73
+ "policy must list this server's issuer address (grant_issuer_info) via addIssuer. Pass the result to " +
74
+ "target's PolicyGate.withGrant function. Verify with grant_verify before broadcasting.",
75
+ inputSchema: {
76
+ policyId: policyIdSchema,
77
+ subject: addressSchema,
78
+ action: actionSchema,
79
+ target: addressSchema.describe("the contract that will consume the grant (the integrator/gate); only it may redeem"),
80
+ ttlSeconds: z
81
+ .number()
82
+ .int()
83
+ .positive()
84
+ .max(86400)
85
+ .default(600)
86
+ .describe("Requested grant lifetime in seconds; clamped to the server's maxGrantTtlSeconds (see grant_issuer_info)"),
87
+ },
88
+ }, async ({ policyId, subject, action, target, ttlSeconds }) => {
89
+ try {
90
+ if (!issuer)
91
+ throw new Error("grant issuance disabled on this server (no issuer key configured)");
92
+ await registry.assertChainId();
93
+ const id = toPolicyId(policyId);
94
+ const authorized = await registry.isAuthorizedIssuer(id, issuer.address);
95
+ if (!authorized) {
96
+ throw new Error(`this server's issuer address ${issuer.address} is not authorized for policy ${id}; ` +
97
+ "the policy owner must call addIssuer first (see policy_update)");
98
+ }
99
+ const allowed = await registry.check(id, subject, action);
100
+ if (!allowed.allowed) {
101
+ throw new Error(`policy denies this: ${allowed.reasons.join("; ")}`);
102
+ }
103
+ return json(await issuer.issue(id, subject, action, ttlSeconds, target));
104
+ }
105
+ catch (error) {
106
+ return jsonError(error);
107
+ }
108
+ });
109
+ server.registerTool("grant_issuer_info", {
110
+ description: "This server's grant-issuer address (authorize it on a policy via addIssuer) and limits.",
111
+ inputSchema: {},
112
+ }, async () => {
113
+ return json({
114
+ issuerEnabled: Boolean(issuer),
115
+ issuerAddress: issuer?.address ?? null,
116
+ maxGrantTtlSeconds: config.maxGrantTtl,
117
+ chainId: config.chainId,
118
+ registry: config.registry,
119
+ verifier: config.verifier,
120
+ });
121
+ });
122
+ server.registerTool("policy_fees", {
123
+ description: "Current protocol fees in wei (read live). createPolicy needs exactly creationFee as msg.value; " +
124
+ "every other write needs exactly updateFee. Read this before building any write tx — wrong value reverts.",
125
+ inputSchema: {},
126
+ }, async () => {
127
+ try {
128
+ const { creationFee, updateFee } = await registry.fees();
129
+ return json({ creationFeeWei: creationFee.toString(), updateFeeWei: updateFee.toString() });
130
+ }
131
+ catch (error) {
132
+ return jsonError(error);
133
+ }
134
+ });
135
+ server.registerTool("grant_verify", {
136
+ description: "Pre-flight a grant before broadcasting: checks the on-chain GrantVerifier for validity (signature, " +
137
+ "validity window, issuer authorization, policy active) and whether the nonce is already used. Returns " +
138
+ "{valid, nonceUsed}. Note: does NOT check subject==caller or target — the gate enforces those on redemption.",
139
+ inputSchema: {
140
+ grant: z
141
+ .object({
142
+ policyId: z.union([z.string(), z.number()]),
143
+ subject: addressSchema,
144
+ action: z.string(),
145
+ issuedAt: z.union([z.string(), z.number()]),
146
+ expiresAt: z.union([z.string(), z.number()]),
147
+ nonce: z.string(),
148
+ issuer: addressSchema,
149
+ target: addressSchema,
150
+ })
151
+ .describe("the grant object exactly as returned by grant_issue"),
152
+ signature: z.string().regex(/^0x[0-9a-fA-F]+$/),
153
+ },
154
+ }, async ({ grant, signature }) => {
155
+ try {
156
+ return json(await registry.verifyGrant({ ...grant, action: grant.action }, signature));
157
+ }
158
+ catch (error) {
159
+ return jsonError(error);
160
+ }
161
+ });
162
+ server.registerTool("policy_create", {
163
+ description: "Build the unsigned transaction that creates a new policy. Returns {to, value, data} for YOUR " +
164
+ "wallet to sign and submit — the submitting address becomes the policy owner. `value` is the " +
165
+ "protocol creation fee in wei.",
166
+ inputSchema: {
167
+ openMembership: z.boolean().default(false).describe("true: every address counts as a member"),
168
+ transferable: z.boolean().default(false).describe("true: ownership can be transferred later"),
169
+ expiresAt: z.number().int().nonnegative().default(0).describe("unix seconds; 0 = never expires"),
170
+ metadataURI: z
171
+ .string()
172
+ .default("")
173
+ .describe("optional metadata pointer, informational only; prefer ipfs:// (content-immutable)"),
174
+ metadataHash: z
175
+ .string()
176
+ .regex(/^0x[0-9a-fA-F]{64}$/)
177
+ .optional()
178
+ .describe("optional keccak256 of the metadata document — on-chain tamper-evidence for the URI's content"),
179
+ },
180
+ }, async (opts) => {
181
+ try {
182
+ return json(await registry.buildCreatePolicy({ ...opts, metadataHash: opts.metadataHash }));
183
+ }
184
+ catch (error) {
185
+ return jsonError(error);
186
+ }
187
+ });
188
+ server.registerTool("policy_update", {
189
+ description: "Build the unsigned transaction for a policy rule change (submit from the owner or an admin " +
190
+ "wallet; `value` is the protocol update fee in wei). Operations: addMembers, removeMembers, " +
191
+ "setActionRule (UNSET|MEMBERS|ANYONE|NOBODY), addIssuer, removeIssuer, addAdmin, removeAdmin, setExpiry.",
192
+ inputSchema: {
193
+ policyId: policyIdSchema,
194
+ operation: z.discriminatedUnion("kind", [
195
+ z.object({ kind: z.literal("addMembers"), members: z.array(addressSchema).min(1) }),
196
+ z.object({ kind: z.literal("removeMembers"), members: z.array(addressSchema).min(1) }),
197
+ z.object({
198
+ kind: z.literal("setActionRule"),
199
+ action: actionSchema,
200
+ rule: z.enum(["UNSET", "MEMBERS", "ANYONE", "NOBODY"]),
201
+ }),
202
+ z.object({ kind: z.literal("addIssuer"), issuer: addressSchema }),
203
+ z.object({ kind: z.literal("removeIssuer"), issuer: addressSchema }),
204
+ z.object({ kind: z.literal("addAdmin"), admin: addressSchema }),
205
+ z.object({ kind: z.literal("removeAdmin"), admin: addressSchema }),
206
+ z.object({ kind: z.literal("setExpiry"), expiresAt: z.number().int().nonnegative() }),
207
+ ]),
208
+ },
209
+ }, async ({ policyId, operation }) => {
210
+ try {
211
+ return json(await registry.buildUpdate(toPolicyId(policyId), operation));
212
+ }
213
+ catch (error) {
214
+ return jsonError(error);
215
+ }
216
+ });
217
+ return server;
218
+ }
219
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@smartpolicy/mcp",
3
+ "version": "0.1.0",
4
+ "description": "SmartPolicy MCP server — runtime authorization for AI agents and smart contracts",
5
+ "type": "module",
6
+ "bin": {
7
+ "smartpolicy-mcp": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "prepack": "tsc",
16
+ "start": "tsx src/index.ts",
17
+ "test": "vitest run",
18
+ "integration": "tsx scripts/integration.ts",
19
+ "smoke:http": "tsx scripts/http-smoke.ts"
20
+ },
21
+ "license": "Apache-2.0",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/smartpolicy-protocol/smartpolicy.git",
25
+ "directory": "mcp"
26
+ },
27
+ "homepage": "https://smartpolicy.io",
28
+ "bugs": "https://github.com/smartpolicy-protocol/smartpolicy/issues",
29
+ "keywords": ["mcp", "modelcontextprotocol", "authorization", "ai-agents", "smart-contracts", "eip-712", "x402", "base"],
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.12.0",
32
+ "viem": "^2.21.0",
33
+ "zod": "^3.23.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^25.9.3",
37
+ "tsx": "^4.19.0",
38
+ "typescript": "^5.6.0",
39
+ "vitest": "^2.1.0"
40
+ }
41
+ }