@fidesbuild/mcp-server 0.8.0 → 0.8.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.
- package/README.md +5 -1
- package/dist/server.d.ts +5 -1
- package/dist/server.js +126 -10
- package/package.json +14 -10
- package/src/server.ts +968 -0
package/README.md
CHANGED
|
@@ -38,7 +38,11 @@ Claude Code and other MCP apps need [Node](https://nodejs.org) 20.10 or later. C
|
|
|
38
38
|
| --- | --- |
|
|
39
39
|
| `fides_setup` | A link to the FIDES app with this agent filled in |
|
|
40
40
|
| `fides_status` | The FIDES: active or not, budget spent and remaining, FIDES Account balance, allowed contracts, expiry, agent address |
|
|
41
|
-
| `fides_plan` | Builds transfers and contract calls into one plan, checks each against the FIDES, groups them, simulates. Sends nothing |
|
|
41
|
+
| `fides_plan` | Builds transfers and contract calls into one plan, checks each against the FIDES, groups them, simulates. Sends nothing. Calls any verified contract by function name and plain values, encoded from its verified source |
|
|
42
|
+
| `fides_inspect_contract` | Reads any contract on the chain and lists what an agent could call, with risky functions flagged |
|
|
43
|
+
| `fides_read_contract` | Reads a value from any verified contract by function name, such as a market or a balance. Free |
|
|
44
|
+
| `fides_check_api` | Reads a paid API's price without paying, and says whether a FIDES can pay it |
|
|
45
|
+
| `fides_swap` | Swaps on Uniswap inside the trading mandate the owner signed |
|
|
42
46
|
| `fides_execute` | Executes a plan by its id. Only the actions inside the FIDES are sent |
|
|
43
47
|
| `fides_pay_request` | Buys from a paid API over x402: checks the price against the service's cap in the FIDES, pays from the FIDES, returns the response |
|
|
44
48
|
| `fides_receipts` | Every transaction executed under the FIDES, with explorer links |
|
package/dist/server.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
-
import { type Hex } from 'viem';
|
|
3
|
+
import { type Address, type Hex, type AbiFunction, type AbiParameter } from 'viem';
|
|
4
4
|
import { type PrivateKeyAccount } from 'viem/accounts';
|
|
5
5
|
import { type FidesAddresses } from '@fidesbuild/sdk';
|
|
6
6
|
import { type SubAddresses } from '@fidesbuild/sub';
|
|
@@ -28,6 +28,10 @@ export declare function agentKey(cfg: Config): {
|
|
|
28
28
|
file: string | null;
|
|
29
29
|
created: boolean;
|
|
30
30
|
};
|
|
31
|
+
/** Turns plain JSON values into what viem encodes for each ABI type. "me" is the FIDES Account. */
|
|
32
|
+
export declare function coerce(p: AbiParameter, v: unknown, me: Address | null, at: string): unknown;
|
|
33
|
+
/** Encodes a call from one ABI function and plain JSON args. */
|
|
34
|
+
export declare function encodeCall(abi: AbiFunction, args: unknown[], me: Address | null): Hex;
|
|
31
35
|
export declare function createFidesMcpServer(cfg: Config): McpServer & {
|
|
32
36
|
agent: `0x${string}`;
|
|
33
37
|
};
|
package/dist/server.js
CHANGED
|
@@ -14,7 +14,7 @@ import { pathToFileURL } from 'node:url';
|
|
|
14
14
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
15
15
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
16
16
|
import { z } from 'zod';
|
|
17
|
-
import { encodeFunctionData, erc20Abi, formatUnits, parseUnits, isAddress, getAddress } from 'viem';
|
|
17
|
+
import { encodeFunctionData, decodeFunctionResult, erc20Abi, formatUnits, parseUnits, isAddress, getAddress } from 'viem';
|
|
18
18
|
import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts';
|
|
19
19
|
import { Fides, FidesBuilder, Policy, Receipts, accountOf, createFidesClient, fromJson, toJson } from '@fidesbuild/sdk';
|
|
20
20
|
import { createX402, decodePaymentRequired, exactEip3009 } from '@fidesbuild/x402';
|
|
@@ -81,6 +81,52 @@ const KNOWN_SERVICES = [
|
|
|
81
81
|
{ id: 'spraay', name: 'Spraay', url: 'https://gateway.spraay.app/api/v1/models', price: '0.001 USDG', returns: 'The AI models the Spraay gateway offers, with providers and prices', run_by: 'Spraay, not FIDES' },
|
|
82
82
|
{ id: 'madeonsol', name: 'MadeOnSol', url: 'https://madeonsol.com/api/x402/rhc/kol/feed?limit=5', price: '0.04 USDG', returns: 'Recent trades on Robinhood Chain by tracked wallets', run_by: 'MadeOnSol, not FIDES' },
|
|
83
83
|
];
|
|
84
|
+
/** Turns plain JSON values into what viem encodes for each ABI type. "me" is the FIDES Account. */
|
|
85
|
+
export function coerce(p, v, me, at) {
|
|
86
|
+
const arr = p.type.match(/^(.*)\[(\d*)\]$/);
|
|
87
|
+
if (arr) {
|
|
88
|
+
if (!Array.isArray(v))
|
|
89
|
+
throw new Error(`${at} must be a list`);
|
|
90
|
+
return v.map((x, i) => coerce({ ...p, type: arr[1] }, x, me, `${at}[${i}]`));
|
|
91
|
+
}
|
|
92
|
+
if (p.type === 'tuple') {
|
|
93
|
+
const parts = p.components;
|
|
94
|
+
const get = (c, i) => (Array.isArray(v) ? v[i] : v?.[c.name ?? '']);
|
|
95
|
+
if (v === null || typeof v !== 'object')
|
|
96
|
+
throw new Error(`${at} must be an object with ${parts.map((c) => c.name).join(', ')}`);
|
|
97
|
+
const out = parts.map((c, i) => coerce(c, get(c, i), me, `${at}.${c.name ?? i}`));
|
|
98
|
+
return Array.isArray(v) || parts.some((c) => !c.name) ? out : Object.fromEntries(parts.map((c, i) => [c.name, out[i]]));
|
|
99
|
+
}
|
|
100
|
+
if (/^u?int\d*$/.test(p.type)) {
|
|
101
|
+
if (!/^-?\d+$/.test(String(v ?? '').trim()))
|
|
102
|
+
throw new Error(`${at} must be a whole number in the token's smallest unit, as a string (got ${JSON.stringify(v)})`);
|
|
103
|
+
return BigInt(String(v).trim());
|
|
104
|
+
}
|
|
105
|
+
if (p.type === 'address') {
|
|
106
|
+
if (typeof v === 'string' && /^me$/i.test(v)) {
|
|
107
|
+
if (!me)
|
|
108
|
+
throw new Error(`${at}: "me" needs a signed FIDES`);
|
|
109
|
+
return me;
|
|
110
|
+
}
|
|
111
|
+
if (typeof v !== 'string' || !isAddress(v))
|
|
112
|
+
throw new Error(`${at} must be an address`);
|
|
113
|
+
return getAddress(v);
|
|
114
|
+
}
|
|
115
|
+
if (p.type === 'bool')
|
|
116
|
+
return v === true || v === 'true';
|
|
117
|
+
if (/^bytes\d*$/.test(p.type)) {
|
|
118
|
+
const h = v === '' || v == null ? '0x' : String(v);
|
|
119
|
+
if (!/^0x([0-9a-fA-F]{2})*$/.test(h))
|
|
120
|
+
throw new Error(`${at} must be hex bytes, like "0x"`);
|
|
121
|
+
return h;
|
|
122
|
+
}
|
|
123
|
+
return v;
|
|
124
|
+
}
|
|
125
|
+
/** Encodes a call from one ABI function and plain JSON args. */
|
|
126
|
+
export function encodeCall(abi, args, me) {
|
|
127
|
+
const values = abi.inputs.map((p, i) => coerce(p, args[i], me, p.name || `arg ${i + 1}`));
|
|
128
|
+
return encodeFunctionData({ abi: [abi], functionName: abi.name, args: values });
|
|
129
|
+
}
|
|
84
130
|
const ok = (value) => ({ content: [{ type: 'text', text: typeof value === 'string' ? value : JSON.stringify(value, null, 2) }] });
|
|
85
131
|
const fail = (message) => ({ content: [{ type: 'text', text: message }], isError: true });
|
|
86
132
|
export function createFidesMcpServer(cfg) {
|
|
@@ -198,7 +244,8 @@ export function createFidesMcpServer(cfg) {
|
|
|
198
244
|
return ok({
|
|
199
245
|
can_do: [
|
|
200
246
|
'Send USDG from the FIDES Account, to one address or many, inside the budget. Several transfers go out as one transaction.',
|
|
201
|
-
'
|
|
247
|
+
'Use any verified contract on Robinhood Chain: read what it lets an agent do, risky functions flagged (fides_inspect_contract), allow the functions you choose (fides_setup with contracts), read values from it for free (fides_read_contract), and call it by function name and plain values (fides_plan with function and args). Example: supply USDG to a Morpho market and withdraw it, never borrow.',
|
|
248
|
+
'Use any paid API that charges on Robinhood Chain: read its price without paying (fides_check_api), allow it with a cap (fides_setup with services), then pay per request (fides_pay_request).',
|
|
202
249
|
'Buy from paid APIs that charge per request over x402, paying from the FIDES budget, each capped per service.',
|
|
203
250
|
'Swap on Uniswap inside a trading mandate the owner signed: tokens it may buy, worst price, most per swap; best route across Robinhood Chain including v4 hook pools, approval and swap as one transaction (fides_swap). The FIDES must allow swaps: fides_setup with swap.',
|
|
204
251
|
'Hand another agent a slice of the FIDES with its own budget and expiry (fides_delegate, SUB-FIDES); or, as the child, act inside a slice handed to you (fides_sub_plan). The FIDES must allow delegation: fides_setup with delegate: true.',
|
|
@@ -240,7 +287,7 @@ export function createFidesMcpServer(cfg) {
|
|
|
240
287
|
});
|
|
241
288
|
server.registerTool('fides_setup', {
|
|
242
289
|
title: 'Set up FIDES',
|
|
243
|
-
description: 'Use when the user wants to set up FIDES, connect their wallet or sign a new FIDES. Returns this computer\'s agent address and a link to the FIDES app with it filled in, where the user sets the limits and signs. The signed FIDES is then picked up automatically. To let the user buy from paid APIs (fides_pay_request), pass the services with a spending cap each. Paid APIs known to work use the ids "fides-demo", "spraay" and "madeonsol" (fides_help has their URLs and prices); for any other paid API, call fides_check_api with its URL and use the service_id it returns. To let the agent call any contract on the chain, pass contracts with the functions it may call by name (fides_inspect_contract lists them and flags the risky ones).',
|
|
290
|
+
description: 'Use when the user wants to set up FIDES, connect their wallet or sign a new FIDES. Returns this computer\'s agent address and a link to the FIDES app with it filled in, where the user sets the limits and signs. The signed FIDES is then picked up automatically. To let the user buy from paid APIs (fides_pay_request), pass the services with a spending cap each. Paid APIs known to work use the ids "fides-demo", "spraay" and "madeonsol" (fides_help has their URLs and prices); for any other paid API, call fides_check_api with its URL and use the service_id it returns. To let the agent call any contract on the chain, pass contracts with the functions it may call by name (fides_inspect_contract lists them and flags the risky ones). When a function pulls tokens from the account (such as Morpho supply, or a vault deposit), also allow approve on that token, so the agent can approve exactly the amount in the same transaction.',
|
|
244
291
|
inputSchema: {
|
|
245
292
|
services: z.array(z.object({ id: z.string().describe('The service id: "fides-demo", "spraay", "madeonsol", or for any other paid API the service_id fides_check_api returns (its host)'), max: z.string().describe('Most the agent may spend on it, in USDG, e.g. "0.1"') })).optional(),
|
|
246
293
|
contracts: z.array(z.object({
|
|
@@ -329,18 +376,20 @@ export function createFidesMcpServer(cfg) {
|
|
|
329
376
|
}
|
|
330
377
|
});
|
|
331
378
|
const actionSchema = z.object({
|
|
332
|
-
kind: z.enum(['transfer', 'call']).describe('"transfer" sends a token from the FIDES Account. "call" calls an allowed contract with raw calldata.'),
|
|
379
|
+
kind: z.enum(['transfer', 'call']).describe('"transfer" sends a token from the FIDES Account. "call" calls an allowed contract, by function name and args (encoded from its verified source), or with raw calldata.'),
|
|
333
380
|
to: z.string().optional().describe('transfer: the recipient address'),
|
|
334
|
-
amount: z.string().optional().describe('transfer: how much, in whole token units, e.g. "1.5". call: how much of the budget token the call spends, if any'),
|
|
381
|
+
amount: z.string().optional().describe('transfer: how much, in whole token units, e.g. "1.5". call: how much of the budget token the call spends, if any, in whole units'),
|
|
335
382
|
token: z.string().optional().describe('transfer: the token address. Defaults to the FIDES\'s budget token'),
|
|
336
383
|
target: z.string().optional().describe('call: the contract address'),
|
|
337
|
-
|
|
384
|
+
function: z.string().optional().describe('call: the function name, e.g. "supply", or its signature when the name is overloaded. FIDES encodes the call from the contract\'s verified source'),
|
|
385
|
+
args: z.array(z.any()).optional().describe('call with function: the arguments in order. Integers as strings in the token\'s smallest unit (USDG has 6 decimals: 0.05 USDG is "50000"). Structs as objects keyed by field name. "me" for an address means this FIDES Account. Empty bytes as "0x"'),
|
|
386
|
+
data: z.string().optional().describe('call: hex calldata, starting with the 4-byte function selector. Use function and args instead when you can'),
|
|
338
387
|
label: z.string().optional().describe('A short description shown in the plan'),
|
|
339
388
|
});
|
|
340
389
|
/** The tool's actions as Builder actions, in the budget token unless a transfer names another. */
|
|
341
390
|
async function buildActions(actions, budget) {
|
|
342
391
|
const built = [];
|
|
343
|
-
for (
|
|
392
|
+
for (let [i, a] of actions.entries()) {
|
|
344
393
|
const n = i + 1;
|
|
345
394
|
if (a.kind === 'transfer') {
|
|
346
395
|
if (!a.to || !isAddress(a.to))
|
|
@@ -364,8 +413,14 @@ export function createFidesMcpServer(cfg) {
|
|
|
364
413
|
else {
|
|
365
414
|
if (!a.target || !isAddress(a.target))
|
|
366
415
|
return { error: `Action ${n}: "target" must be a contract address.` };
|
|
416
|
+
if (a.function && !a.data) {
|
|
417
|
+
const enc = await encodeByName(getAddress(a.target), a.function, a.args ?? [], 'write');
|
|
418
|
+
if ('error' in enc)
|
|
419
|
+
return { error: `Action ${n}: ${enc.error}` };
|
|
420
|
+
a = { ...a, data: enc.data, label: a.label ?? enc.label };
|
|
421
|
+
}
|
|
367
422
|
if (!a.data || !/^0x([0-9a-fA-F]{2}){4,}$/.test(a.data))
|
|
368
|
-
return { error: `Action ${n}: "data"
|
|
423
|
+
return { error: `Action ${n}: give "function" and "args", or "data" as hex calldata starting with the 4-byte selector.` };
|
|
369
424
|
const t = await token(budget);
|
|
370
425
|
let spend = 0n;
|
|
371
426
|
if (a.amount) {
|
|
@@ -384,7 +439,7 @@ export function createFidesMcpServer(cfg) {
|
|
|
384
439
|
}
|
|
385
440
|
server.registerTool('fides_plan', {
|
|
386
441
|
title: 'Plan actions under the FIDES',
|
|
387
|
-
description: 'Builds the actions into one execution plan: checks every action against the FIDES, groups what can go out together, and simulates it against the chain. Sends nothing. Returns a plan_id for fides_execute. Show the result to the user before executing.',
|
|
442
|
+
description: 'Builds the actions into one execution plan: checks every action against the FIDES, groups what can go out together, and simulates it against the chain. Sends nothing. Returns a plan_id for fides_execute. Show the result to the user before executing. Call contracts by function name and args; FIDES encodes them from the verified source. When a contract pulls tokens (e.g. Morpho supply), put an approve of exactly that amount first in the same plan, so nothing stays approved, and set amount on the call so it counts against the budget. Use "me" for addresses that should be the FIDES Account.',
|
|
388
443
|
inputSchema: { actions: z.array(actionSchema).min(1).max(50) },
|
|
389
444
|
}, async ({ actions }) => {
|
|
390
445
|
try {
|
|
@@ -658,6 +713,42 @@ export function createFidesMcpServer(cfg) {
|
|
|
658
713
|
throw new Error(json?.error?.message ?? `HTTP ${res.status}`);
|
|
659
714
|
return json;
|
|
660
715
|
}
|
|
716
|
+
/** Encodes a call to `fn` on `target` from the contract's verified ABI (standard ERC-20 functions work without one). */
|
|
717
|
+
async function encodeByName(target, fn, args, kind) {
|
|
718
|
+
let info = null;
|
|
719
|
+
try {
|
|
720
|
+
info = await inspect(target);
|
|
721
|
+
}
|
|
722
|
+
catch { /* fall back to ERC-20 below */ }
|
|
723
|
+
const list = (kind === 'write' ? info?.functions : info?.reads) ?? [];
|
|
724
|
+
const byName = (x) => x.abi.name === fn || `${x.abi.name}(${x.abi.inputs.map((i) => i.type).join(',')})` === fn.replace(/\s/g, '') || x.signature === fn;
|
|
725
|
+
let matches = list.filter((x) => x.abi && byName(x));
|
|
726
|
+
if (!matches.length) {
|
|
727
|
+
const std = erc20Abi.filter((x) => x.type === 'function' && x.name === fn && (kind === 'read') === (x.stateMutability === 'view'));
|
|
728
|
+
matches = std.map((abi) => ({ abi }));
|
|
729
|
+
}
|
|
730
|
+
if (matches.length > 1)
|
|
731
|
+
matches = matches.filter((x) => x.abi.inputs.length === args.length);
|
|
732
|
+
if (!matches.length) {
|
|
733
|
+
if (info && !info.verified)
|
|
734
|
+
return { error: `${target} is not verified on Sourcify, so "${fn}" cannot be encoded by name. Pass "data" as hex calldata instead.` };
|
|
735
|
+
const names = list.map((x) => x.name).filter(Boolean);
|
|
736
|
+
return { error: `${info?.name ?? target} has no ${kind === 'write' ? 'write' : 'read'} function "${fn}"${names.length ? `. It has: ${[...new Set(names)].join(', ')}` : ''}.` };
|
|
737
|
+
}
|
|
738
|
+
if (matches.length > 1)
|
|
739
|
+
return { error: `"${fn}" is overloaded; give its signature, one of: ${matches.map((x) => `${x.abi.name}(${x.abi.inputs.map((i) => i.type).join(',')})`).join(', ')}.` };
|
|
740
|
+
const abi = matches[0].abi;
|
|
741
|
+
if (args.length !== abi.inputs.length)
|
|
742
|
+
return { error: `${abi.name} takes ${abi.inputs.length} argument(s): ${abi.inputs.map((i) => `${i.type} ${i.name ?? ''}`.trim()).join(', ')}. Got ${args.length}.` };
|
|
743
|
+
const me = (await currentFides().catch(() => null))?.account ?? null;
|
|
744
|
+
try {
|
|
745
|
+
const data = encodeCall(abi, args, me);
|
|
746
|
+
return { data, label: `${info?.name ?? 'contract'}.${abi.name} on ${target}`, abi, name: info?.name ?? null };
|
|
747
|
+
}
|
|
748
|
+
catch (err) {
|
|
749
|
+
return { error: err?.shortMessage ?? err?.message ?? String(err) };
|
|
750
|
+
}
|
|
751
|
+
}
|
|
661
752
|
server.registerTool('fides_inspect_contract', {
|
|
662
753
|
title: 'What a contract lets an agent do',
|
|
663
754
|
description: 'Reads any contract on the chain from its verified source (proxies followed) and lists the functions that change something, in plain words, with risks flagged: "danger" (lasting approvals, handing control to another address, upgrades, debt), "warn" (the agent picks where funds go, or it sends ETH) and "admin" (operator-only; will fail for an agent). Use it before fides_setup with contracts, and recommend only the functions the user needs. Sends nothing.',
|
|
@@ -672,13 +763,38 @@ export function createFidesMcpServer(cfg) {
|
|
|
672
763
|
return ok({
|
|
673
764
|
name: info.name, address: info.address, verified: true, proxy: info.proxy ?? undefined,
|
|
674
765
|
functions: info.functions.map((fn) => ({ name: fn.name, does: fn.about || undefined, signature: fn.signature, selector: fn.selector, risks: fn.risks.length ? fn.risks.map((r) => `${r.level}: ${r.why}`) : undefined })),
|
|
675
|
-
|
|
766
|
+
reads: info.reads?.length ? info.reads.map((fn) => fn.signature) : undefined,
|
|
767
|
+
next: 'To allow some of these, call fides_setup with contracts: [{ address, functions: [names] }] and give the user the link. Once signed, call them with fides_plan: { kind: "call", target, function, args }. Read functions are free: fides_read_contract.',
|
|
676
768
|
});
|
|
677
769
|
}
|
|
678
770
|
catch (err) {
|
|
679
771
|
return fail('Could not read the contract: ' + (err?.message ?? err));
|
|
680
772
|
}
|
|
681
773
|
});
|
|
774
|
+
server.registerTool('fides_read_contract', {
|
|
775
|
+
title: 'Read from a contract',
|
|
776
|
+
description: 'Calls a read-only (view) function on any verified contract on the chain, by name, and returns the result. Free: nothing is signed or sent, and it needs no permission in the FIDES. Use it to look up what a write needs, such as a market\'s parameters or a balance. Integers come back as strings in the smallest unit.',
|
|
777
|
+
inputSchema: {
|
|
778
|
+
address: z.string().describe('The contract address'),
|
|
779
|
+
function: z.string().describe('The view function name, or its signature when overloaded'),
|
|
780
|
+
args: z.array(z.any()).optional().describe('The arguments in order. Integers as strings. "me" for an address means this FIDES Account'),
|
|
781
|
+
},
|
|
782
|
+
}, async ({ address, function: fn, args }) => {
|
|
783
|
+
try {
|
|
784
|
+
if (!isAddress(address))
|
|
785
|
+
return fail('That is not a contract address.');
|
|
786
|
+
const enc = await encodeByName(getAddress(address), fn, args ?? [], 'read');
|
|
787
|
+
if ('error' in enc)
|
|
788
|
+
return fail(enc.error);
|
|
789
|
+
const { data } = await client.public.call({ to: getAddress(address), data: enc.data });
|
|
790
|
+
const result = decodeFunctionResult({ abi: [enc.abi], functionName: enc.abi.name, data: data ?? '0x' });
|
|
791
|
+
const named = enc.abi.outputs.length > 1 && enc.abi.outputs.every((o) => o.name) && Array.isArray(result) ? Object.fromEntries(enc.abi.outputs.map((o, i) => [o.name, result[i]])) : result;
|
|
792
|
+
return ok({ contract: enc.name ?? address, function: enc.abi.name, result: JSON.parse(JSON.stringify(named, (_k, x) => (typeof x === 'bigint' ? x.toString() : x))) });
|
|
793
|
+
}
|
|
794
|
+
catch (err) {
|
|
795
|
+
return fail('Could not read: ' + failure(err?.shortMessage ?? err?.message ?? err));
|
|
796
|
+
}
|
|
797
|
+
});
|
|
682
798
|
server.registerTool('fides_check_api', {
|
|
683
799
|
title: 'Can FIDES pay this API?',
|
|
684
800
|
description: 'Calls a paid API\'s URL once, without paying, and reads its x402 price: whether a FIDES on Robinhood Chain can pay it, the price, who is paid, and the service id and a suggested cap to use with fides_setup. Use it when the user wants the agent to use a paid API that is not one of the known ones. Pays nothing.',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fidesbuild/mcp-server",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "FIDES as tools for Claude and any MCP client: plan and execute actions inside a signed FIDES, gas paid by the hosted relayer.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"fides",
|
|
@@ -14,14 +14,9 @@
|
|
|
14
14
|
"homepage": "https://fidesbuilder.xyz/docs",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"type": "module",
|
|
17
|
-
"exports":
|
|
18
|
-
".": {
|
|
19
|
-
"types": "./dist/server.d.ts",
|
|
20
|
-
"default": "./dist/server.js"
|
|
21
|
-
}
|
|
22
|
-
},
|
|
17
|
+
"exports": "./src/server.ts",
|
|
23
18
|
"bin": {
|
|
24
|
-
"fides-mcp": "./
|
|
19
|
+
"fides-mcp": "./src/server.ts"
|
|
25
20
|
},
|
|
26
21
|
"files": [
|
|
27
22
|
"dist",
|
|
@@ -32,7 +27,16 @@
|
|
|
32
27
|
"node": ">=20.10"
|
|
33
28
|
},
|
|
34
29
|
"publishConfig": {
|
|
35
|
-
"access": "public"
|
|
30
|
+
"access": "public",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/server.d.ts",
|
|
34
|
+
"default": "./dist/server.js"
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
"bin": {
|
|
38
|
+
"fides-mcp": "./dist/server.js"
|
|
39
|
+
}
|
|
36
40
|
},
|
|
37
41
|
"dependencies": {
|
|
38
42
|
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
@@ -44,4 +48,4 @@
|
|
|
44
48
|
"@fidesbuild/sub": "0.2.0",
|
|
45
49
|
"@fidesbuild/swap": "0.2.0"
|
|
46
50
|
}
|
|
47
|
-
}
|
|
51
|
+
}
|